2009-11-13 42 views
1

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

5回答几乎是同一时间! – RageZ 2009-11-13 02:23:36

+0

如果我想要在主体内有另一个while循环并将记录进一步分割,该怎么办?我注意到,那么第一个循环不会循环超过第一次迭代,为什么? – goe 2009-11-13 03:37:56

回答

2

Try 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); 
      } 
    } 
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具有操作性的优势一次超过一个字符串。

2

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

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); 
      } 
} 
2

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

char del[] = ";";