2013-09-19 3 views
1

Im возникают некоторые проблемы, дело с указателями в С.копирование строки из 2d массива в 1d массива

моего код нагрузки в большой строке символов из текстового файла

1378251369.691375 84:1b:5e:a8:bf:7f 68:94:23:4b:e8:35 100 
1378251374.195670 00:8e:f2:c0:13:cc 00:11:d9:20:aa:4e 397 
1378251374.205047 00:8e:f2:c0:13:cc 00:11:d9:20:aa:4e 397 
1378251374.551604 00:8e:f2:c0:13:cc 00:11:d9:20:aa:4e 157 
1378251375.551618 84:1b:5e:a8:bf:7c cc:3a:61:df:4b:61 37 

и затем копирует каждую строку в массив (fullinfo [200] [BUFSIZ]).

im затем пытается оспаривать последние две части информации и помещать их в собственный массив , например.

cut2line[0] = 68:94:23:4b:e8:35 100 
cut2line[1] = 00:11:d9:20:aa:4e 397 

, чтобы сделать это, я попробовал STRCPY и тетсру

 fullinfo[200][BUFSIZ]; 
    char cutline[BUFSIZ]; 
    char cut2line[BUFSIZ]; 

     while(fgets(line, sizeof line, pi) != NULL) { 

      strcpy(fullinfo[infoline], line); 

      strcpy(cutline,fullinfo[infoline]); 
      memcpy(cut2line,*cutline[25],100); 
      printf("%s",cutline);  
      infoline ++; 

    } 

оба из которых дают либо

invalid type of argument of unary '*' (have 'int') 

или что-то с участием неправильных типов указателей.

всякая помощь приветствуется.

Edit в clarrify: Cutline содержит всю строку FROMTHE входной файл, который является правильным, но когда я пытаюсь скопировать вторую часть линии в свой собственный массив, я получаю ошибки

+1

Вы хотите использовать амперсанд для создания указателя из элемента массива. Не звезда. – Konstantin

ответ

0
while(fgets(line, sizeof line, pi) != NULL) { 

     strcpy(fullinfo[infoline], line); 

     strcpy(cutline,fullinfo[infoline]); 
     //memcpy(cut2line,*cutline[25],100); This line is what's causing your issue I think. 
     memcpy(cut2line,&cutline[25],100); //Use an & 
     printf("%s",cutline);  
     infoline ++; 

} 
+0

Теперь он компилируется, но он не копирует, как я ожидал, используя [25], не начнет ли он копировать из 25-го элемента? – user1687085

+0

Если я правильно помню, говоря вам [25], вы говорите, что вам нужен только 26-й элемент, а не * start * на 26-м элементе.Если вы хотите скопировать * из * этого элемента, возможно, вам придется использовать что-то другое, кроме memcpy, например, strcpy() –

+0

Помните, [0] - это первый элемент, поэтому [25] - это 26-й элемент. –

0

Несколько вещей здесь ,

char cut2line[BUFSIZ]; 

Это означает объявление и определение массива символов, то есть массив одиночных символов. Я думаю, что вы хотите, массив указателей на строки, т.е.

char *cut2line[200]; //not sure if the size is right here. 

Далее, так как это только массив указателей, вы должны выделить то, что указатели на самом деле указывают. Вы можете использовать malloc() или даже strdup(), что делает malloc() под обложками.

(Или вы могли бы использовать в стеке выделяется массив 2D обугленного, как вы предположительно знаете длину строк и количество строк.)

Оператор * разыменовывает что в cutline[25], так как ожидал указатель. Я почти уверен, что это не то, что вы хотите. Если вы работаете с вышеуказанными предложениями, cutline[n] предоставит вам необходимый вам указатель.

Сказав все это, я думаю, что c - не самый простой язык для быстрого создания чего-то вместе, чтобы жонглировать такими строками (и c - это то, что мне платят за программу). Я бы предпочел скриптовый язык, возможно, python (или perl или tcl или ruby, что вам больше всего нравится). На самом деле сценарий оболочки bash, вероятно, тоже будет лучше. С языком сценариев вам просто не нужно беспокоиться о указателях, разборах и выделениях и т. П. Единственная причина для этого в c - производительность, т. Е. Ваш входной файл (ы) огромен.

Смежные вопросы