繁体   English   中英

我正在尝试用定界符分割字符串,但是它不起作用,为什么?

[英]I'm trying to split a string by a delimiter but it doesn't work, why?

我写了下面的代码从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);
            }
}

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函数 ,它的优点是一次处理多个字符串。

尝试char * del =“;”;

第二个参数应该是一个以null结尾的字符串,即一个以null结尾的char数组。

然后将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);
            }
     }

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

strtok()希望定界符字符串恰好是-以空值终止的C字符串。 您正在为它传递一个字符,因为分号不是空字符,所以它显然不是以空字符结尾的字符串。 相反,请尝试以下操作:

char del[] = ";";

我不确定,但我认为是因为您的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);
            }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM