我试图用分隔符拆分一个字符串,但它不起作用,为什么?

时间:2009-11-13 02:17:20

标签: c split stdin

我写了下面的代码,从stdin ex。

逐行阅读
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 个答案:

答案 0 :(得分: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 function,它有一次处理多个字符串的优势。

答案 1 :(得分: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);
            }
     }

答案 2 :(得分:2)

您对strtok()的调用非常容易发生段错误。 &amp; del指向的char *没有NULL终止符。

答案 3 :(得分:2)

strtok()期望分隔符字符串恰好是 - 以空值终止的C字符串。你传给它一个字符,显然不是以空字符结尾的字符串,因为分号不是空字符。相反,试试这个:

char del[] = ";";

答案 4 :(得分: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);
            }
}