Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Удаление "мусора"


Автор: freeKODE 15.7.2009, 15:28
Нужно удалить мусор из массива ed, он начинается с 48 ячейки походу. Да и вобще откуда он там взялся? В туксе мусор был на одну ячейку и разный, а в венде один и тот же в две ячейки.
Код
/*------------------------
----------lunks.c---------
----цопарайт-free_kode----
------------------------*/
#include <stdio.h>
#include <string.h>
#define MAXPATH 50 //самый большой адрес
#define MAXPROGRAMM 20 //максимальное количество браузеров
int main(int argc, char *argv[]){
FILE *conf;
char lnk[MAXPATH][MAXPROGRAMM],brit[1],allone[1],ed[MAXPATH+15];//массив для адресов браузеров, чет я не въезжаю в эти указатели, посмотри тут
char op1,op2,op3,brs;
char *brsyc;
int i=0,k=0,z=0,brsit,lok,len;
conf=fopen(".luconfig","r");//конец единственного, наверно, правльного блока кода

if (argv[1]==0){
return 0;}

brit[0]=getc(conf);
brit[1]=getc(conf);
brsyc=&brit[0];
lok=atoi(brsyc);
//printf("вот сколько %d\n", lok);
lok -=1;

for(k=0;k<=lok;++k){//заполнения массива адресами, ага пить надо меньше, для красоты;)
    while((lnk[i][k]=getc(conf))!='\n')
    {
    ++i;
    }
    i=0;
}
//printf("вот сколько недо %c\n", lnk[0][1]);

//printf("ааццко параметр %s %d\n",argv[1],argc);

for(k=0;k<=lok;++k){
    for(i=0;i<=MAXPATH;++i){
    ed[i]=lnk[i][k];}
//printf("так-то %s\n",&ed);
}

//printf("хы %s\n",ed);
//printf("ff %d\n",len);
strcat(ed,argv[1]);
//printf("qqq %s\n",ed);

len=strlen(ed);
for(z=0;z<=len;++z){
    if(ed[z]=='\n'){
    ed[z]=' ';}
//system(ed);
//sleep(3);
}

printf("1 %s\n",ed);
//printf("2 %s\n",argv[1]);
printf("3 %c\n",ed[48]);
fclose(conf);
}


Модератор: Учимся пользоваться кнопочкой "Код". И не надо текст выкладывать на внешние сайты.

Автор: DmitrySDolzhenko 15.7.2009, 15:58
Код

for(k=0;k<=lok;++k){
    for(i=0;i<=MAXPATH;++i){
    ed[i]=lnk[i][k];}
//printf("так-то %s\n",&ed);
}


замени на 

Код

for(k=0;k<=lok;++k){
    for(i=0;i<=MAXPATH;++i){
    ed[i]=lnk[i][k];}
ed[i] = 0;
printf("так-то %s\n",ed);
}


или добавь цикл

Код

for( i = 0; i < MAXPATH+15; i++)
ed[i] = 0;

Автор: bsa 15.7.2009, 15:59
freeKODE, ну начнем с того, что код надо бы переформатировать. потому что "это" читать невозможно.
Код
char brit[1], allone[1]; //создали массив символов под один элемент
...
brit[0]=getc(conf); //записали в него что-то
brit[1]=getc(conf); //записали в следующий что-то (т.е. испортили allone, например)
brsyc=&brit[0]; //взяли адрес первого элемента массива
lok=atoi(brsyc); //попытались сделать из него целое число

Итак, в чем ошибки:
1. char brit[1] - выделяет массив под 1 элемент (элементы считаются с 0, т.е. доступ к элементу с индексом 1 - недопустим)
2. доступ ко второму элементу массива brit, когда он состоит только из одного
3. попытка преобразовать строку, которая находится по адресу brsyc в число. Но у тебя там не строка! А один символ. Строка - это массив символов, который оканчивается символом '\0'.

Есть правила форматирования кода:
1. Одна операция - одна строка. (т.е. не стоит писать char lnk[MAXPATH][MAXPROGRAMM],brit[1],allone[1],ed[MAXPATH+15];) Определи каждую переменную на отдельной строке. И у каждой отдельно укажи тип (т.е. не через запятую).
2. Блок внутри операторных скобок должен быть с отступом относительно родительского:
Код
//уровень 0
int main()
{
   //уровень 1
   int a[10];
   for(int i = 0; i < 10; ++i) {
      //уровень 2
      a[i] = 0;
      printf(...);
   }
   if (...) {
      //уровень 2
      scanf(..);
   }
}

3. Закрывающая фигурная скобка всегда идет на отдельной строке и на уровне оператора ее породившего (см. пример)
4. Открывающая фигурная скобка идет или сразу за оператором или на следующей за ним строке (см. пример if и for), но на его уровне (см. пример main). Порядок размещения фигурных скобок должен быть одинаковым для всего проекта, исключение, стиль linux - у меня в примере.
5. Названия переменных должны отражать их назначение (исключение, i,j,k и т.п. используемые как счетчики циклов).
6. Объявление переменной должно быть как можно ближе к первому ее использованию (если позволяет компилятор - старые компиляторы Си это не позволяли).
7. Префиксная форма операторов ++ и -- предпочтительней там, где не требуются функциональные особенности постфиксных.
8. Ставь пробелы вокруг операторов: for(int i = 0; i < 10; ++i) выглядит и понимается легче, чем for(int i=0;i<10;++i)

Автор: freeKODE 15.7.2009, 20:37
bsa, исправлюсь

DmitrySDolzhenko, увы добавление цикла, не решило проблему с мусором
мусор появляеться (кажись) после strcat(); 

Автор: bsa 15.7.2009, 22:20
Цитата(freeKODE @ 15.7.2009,  20:37)
bsa, исправлюсь

Ну и где исправленный код? Ты думаешь кто-то пытается найти ошибки в том коде, что приведен выше? Сомневаюсь. Там их очень много. Отформатируй код, исправь ошибки, на которые указал я, которые указал DmitrySDolzhenko. Может уже и остальные сам найдешь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)