Ошибка при токенизации строк из строки - PullRequest
0 голосов
/ 12 июля 2011

Я хочу сгенерировать таблицу символов из кода сборки 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.

Ответы [ 3 ]

3 голосов
/ 12 июля 2011

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

  while(1)
  {
       wordReader = strtok(NULL," \n");
       printf("%s\n",wordReader);
  }
1 голос
/ 12 июля 2011

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

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

for(wordReader = strtok(lineReader, " \n");
    wordReader != NULL;
    wordReader = strtok(NULL, " \n"))
{
   printf("found token: '%s'\n", wordReader);
}
0 голосов
/ 12 июля 2011

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

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

...