Ошибка при токенизации строк из строки

Я хочу создать таблицу символов из кода сборки SIC. Для этого я попытался отделить все строки от ассемблерного кода. Следовательно, пытаясь сделать первый шаг для этого, я попробовал этот код.

Здесь я попытался прочитать ассемблерный код из файла построчно. А затем разделить строки в строке на токены.

Когда я удаляю раздел разделения токенов (как указано в коде), я печатаю все строки, как и ожидалось. Но если я работаю вместе с разделением токенов, первая строка считывается, и токены разделяются, как я и ожидал. Но для второй строки я получаю ошибку как ошибку сегментации. Я не мог отследить, где я ошибся.

Итак, мне нужны разъяснения от экспертов.

Заранее спасибо.

 FILE* sourceCode =  fopen("/home/muthu/LangFiles/SIC/PASS1/PROGRAM.txt","r");
  if(checkForFileOpeningErrors() == ERROR)  //Iam using separate function
      return EXIT_FAILURE;  //Terminate the program.
  int maxLineLength = 50;
  while(1)
  {
           char* lineReader = NULL;  // since getline will reallocate.
       if( getline(&lineReader,(size_t*)&maxLineLength,sourceCode) == -1 )
           break;
       printf("%s",lineReader);

// TOKEN SEPARATION STARTS HERE....   If I comment this section out iam getting all lines printed 
            char* wordReader;
      wordReader = strtok(lineReader," \n");
      printf("%s\n",wordReader);
      while(1)
      {
           wordReader = strtok(NULL," \n");
           printf("%s\n",wordReader);
      }
// TOKEN SEPARATION ENDS HERE....
  }

Мой файл:

COPY START 1000  
FIRST STL RETADR 
CLOOP JSUB RDREC  
LDA LENGTH
COMP ZERO
JEQ ENDFIL
JSUB WRREC 
J CLOOP
.
.
.
END

Мой образец вывода:

muthu@muthu-G31M-ES2L:~/LangFiles/PASS1$ ./a.out
All Files successfully opened!! Operation has begun...
COPY START 1000 

COPY
START
1000
segmentation Fault.

person Muthu Ganapathy Nathan    schedule 12.07.2011    source источник
comment
Как определена ваша функция getline? Кстати, обратите внимание, что у вас, похоже, есть утечка памяти, поскольку функция getline, по-видимому, выделяет память для строки, которая никогда не освобождается.   -  person Sander De Dycker    schedule 12.07.2011
comment
И бесконечный цикл внутри бесконечного цикла. должен идти глубже   -  person Vinicius Kamakura    schedule 12.07.2011
comment
Спасибо всем. Я получил ответ сейчас. Я ошибся, запустив только бесконечный цикл. Большое тебе спасибо.   -  person Muthu Ganapathy Nathan    schedule 12.07.2011


Ответы (3)


Когда вы ожидаете, что этот цикл завершится?

  while(1)
  {
       wordReader = strtok(NULL," \n");
       printf("%s\n",wordReader);
  }
person Roddy    schedule 12.07.2011

Вы используете strtok() неправильно. Он вернет NULL, когда больше не будет найдено токенов, и вам не следует пытаться напечатать это. Кроме того, ваш цикл бесконечен, что будет проблемой.

Цикл, вероятно, должен выглядеть примерно так, поскольку сейчас вы передаете один и тот же аргумент strtok() на каждой итерации, что, конечно, никогда не будет успешным:

for(wordReader = strtok(lineReader, " \n");
    wordReader != NULL;
    wordReader = strtok(NULL, " \n"))
{
   printf("found token: '%s'\n", wordReader);
}
person unwind    schedule 12.07.2011
comment
не могли бы вы объяснить мне, почему бы не напечатать это. В strtok, где я ошибся, как я могу это исправить. - person Muthu Ganapathy Nathan; 12.07.2011

Вы никогда не выходите из цикла while(1), поэтому он пытается продолжаться вечно, но вызывает ошибку сегментации, когда strtok возвращает NULL.

Вам нужно проверить, возвращает ли strtok NULL, и выйти из цикла в этот момент.

person Sander De Dycker    schedule 12.07.2011