1

我写了下面的代码从stdin ex逐行读取。

城市=波士顿;城市=纽约;城市=芝加哥\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);
            }
}
4

5 回答 5

3

strtok第二个参数需要一个末尾带有 nul (零字节)的字符串。改变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函数具有一次处理多个字符串的优点。

于 2009-11-13T02:20:45.623 回答
2

试试 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);
            }
     }
于 2009-11-13T02:20:40.520 回答
2

您对 strtok() 的调用很可能会出现段错误。&del 指向的 char * 没有 NULL 终止符。

于 2009-11-13T02:21:11.097 回答
2

strtok()期望分隔符字符串完全是 - 一个以 null 结尾的 C 字符串。您传递给它的是单个字符,这显然不是以空字符结尾的字符串,因为分号不是空字符。相反,试试这个:

char del[] = ";";
于 2009-11-13T02:21:46.743 回答
1

我不确定,但我认为因为你的 del 最后不会有正确的 '\0' 。

您必须确保字符串以 NULL 结尾,否则大多数字符串函数将在您的变量之后读取内存,这可能会导致很多问题

像这样会更好:

    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);
            }
}
于 2009-11-13T02:21:22.570 回答