2014-10-27 897 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; 
}