2014-10-27 900 views
7

我有分割字符串的问题。下面的代码工作,但只有在字符串之间是''(空格)。但是,即使有任何空格 char,我仍需要拆分字符串。是否需要strtok()在C中使用strtok使用多个分隔符的分割字符串

char input[1024]; 
char *string[3];   
int i=0; 

fgets(input,1024,stdin)!='\0')    //get input 
{           
    string[0]=strtok(input," ");    //parce first string 
    while(string[i]!=NULL)      //parce others 
    { 
    printf("string [%d]=%s\n",i,string[i]); 
    i++; 
    string[i]=strtok(NULL," "); 
    } 
+1

的参数'strtok'只要你想最多可以包含分隔符。 – usr2564301 2014-10-27 22:32:18

+1

i。即,'strtok(input,“\ t \ r \ n \ f \ v”);'和'strtok(NULL,“\ t \ r \ n \ f \ v”);'。 – 2014-10-27 22:38:21

+1

而你的'fgets()'语句看起来不正确(也缺少';')。如果它是循环的一部分,则无法与'\ 0'比较失败。 – 2014-10-27 22:40:20

回答

6

一个简单的例子,显示了如何在代码中使用多个分隔符和潜在的改进。查看嵌入式注释以获得解释

被警告的strtok()(从手动)一般缺点:

这些功能修改他们的第一个参数。

这些函数不能用于常量字符串。

定界字节的标识丢失。

strtok()函数在解析时使用了一个静态缓冲区,所以它不是线程 安全。如果这对您很重要,请使用strtok_r()


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

int main(void) 
{  
    char input[1024]; 
    char *string[256];   // 1) 3 is dangerously small,256 can hold a while;-) 
           // You may want to dynamically allocate the pointers 
           // in a general, robust case. 
    char delimit[]=" \t\r\n\v\f"; // 2) POSIX whitespace characters 
    int i = 0, j = 0; 

    if(fgets(input, sizeof input, stdin)) // 3) fgets() returns NULL on error. 
             // 4) Better practice to use sizeof 
             // input rather hard-coding size 
    {           
    string[i]=strtok(input,delimit); // 5) Make use of i to be explicit 
    while(string[i]!=NULL)      
    { 
     printf("string [%d]=%s\n",i,string[i]); 
     i++; 
     string[i]=strtok(NULL,delimit); 
    } 

    for (j=0;j<i;j++) 
    printf("%s", string[i]); 
    } 

    return 0; 
}