Я пытаюсь разделить строку разделителем, но это не работает, почему? - PullRequest
1 голос
/ 13 ноября 2009

Я написал ниже код для чтения строки за строкой из стандартного ввода.

city=Boston;city=New York;city=Chicago\n

, а затем разбить каждую строку на ';' разделитель и печать каждой записи.

Но по какой-то причине указатель «запись» возвращается всегда нулевым. Почему?

    char    del = ';';
    char    input[BUFLEN];

    while(fgets(input, BUFLEN, fp)) {

            input[strlen(input)-1]='\0';
            char* record = strtok(input, &del);

            while(record) {
                    printf("Record: %s\n",record);
                    record = strtok(NULL, &del);
            }
}

Ответы [ 5 ]

3 голосов
/ 13 ноября 2009

strtok нужна строка с нулем (нулевой байт) в конце для второго аргумента. Измените del на

 char * del = ";"

Вот полная программа (за исключением части чтения ввода):

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

int main ()
{
   char*    del = ";";
   char * input = strdup ("city=Boston;city=New York;city=Chicago\n");
   char* record = strtok (input, del);
   while (record) {
       printf("Record: %s\n",record);
       record = strtok (NULL, del);
   }
}

Попробуйте: http://codepad.org/tzzxjOJE

Существует также функция strsep , которая имеет преимущество обработки более чем одной строки за раз.

2 голосов
/ 13 ноября 2009

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

char del[] = ";";
2 голосов
/ 13 ноября 2009

Ваш вызов strtok (), скорее всего, приведет к сбою. Символ, на который указывает & del, не имеет терминатора NULL.

2 голосов
/ 13 ноября 2009

Попробуйте char * del = ";";

Второй параметр должен быть строкой с нулевым символом в конце, то есть массивом символов с нулевым символом завершения.

А затем перейдите в del к strtok.

   char*    del = ";";
   char    input[BUFLEN];

    while(fgets(input, BUFLEN, fp)) {

            input[strlen(input)-1]='\0';
            char* record = strtok(input, del);

            while(record) {
                    printf("Record: %s\n",record);
                    record = strtok(NULL, del);
            }
     }
1 голос
/ 13 ноября 2009

Я не уверен, но думаю, потому что у вашего del не будет правильного '\ 0' в конце.

Вы должны убедиться, что строка завершена NULL или большая часть строковой функции будет считывать память после вашей переменной, что может привести к LOTS проблем

примерно так будет лучше:

    char    *del = ";";
    char    input[BUFLEN];

    while(fgets(input, BUFLEN, fp)) {

            input[strlen(input)-1]='\0';
            char* record = strtok(input, del);

            while(record) {
                    printf("Record: %s\n",record);
                    record = strtok(NULL, del);
            }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...