Почему следующая программа на C выдает ошибку шины? - PullRequest
6 голосов
/ 19 декабря 2010

Я думаю, что это самый первый вызов strtok, который терпит неудачу.Прошло много времени с тех пор, как я написал C, и я в растерянности.Большое спасибо.

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {
  char *str = "one|two|three";

  char *tok = strtok(str, "|");

  while (tok != NULL) {
    printf("%s\n", tok);
    tok = strtok(NULL, "|");
  }

  return 0;
}

Ответы [ 3 ]

7 голосов
/ 19 декабря 2010

Строковые литералы должны быть присвоены const char *, так как их изменение - неопределенное поведение. Я почти уверен, что strtok изменяет свой аргумент, который объясняет плохие вещи, которые вы видите.

2 голосов
/ 19 декабря 2010

Есть 2 проблемы:

  1. Марка str типа char[].GCC выдает предупреждение foo.cpp:5: warning: deprecated conversion from string constant to ‘char*’, указывающее, что это проблематичная строка.

  2. Ваш второй вызов strtok() должен иметь NULL в качестве первого аргумента.См. документы .

Полученный рабочий код:

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {
  char str[] = "one|two|three";

  char *tok = strtok(str, "|");

  while (tok != NULL) {
    printf("%s\n", tok);
    tok = strtok(NULL, "|");
  }

  return 0;
}

, который выводит

one
two
three
0 голосов
/ 19 декабря 2010

Я не уверен, что такое ошибка "bus", но первый аргумент strtok () в цикле должен быть NULL, если вы хотите продолжить анализ той же строки.

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

...