在C语言中使用strtok函数拆分包含多个分隔符的字符串

14

我在字符串分割方面遇到了问题。下面的代码是有效的,但只有在字符串之间有空格时才有效。但我需要即使存在任何空白字符也能分割字符串。是否有必要使用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的参数可以包含任意数量的分隔符。 - Jongware
1
strtok(input, " \t\r\n\f\v");strtok(NULL, " \t\r\n\f\v"); - The Paramagnetic Croissant
1
而且你的 fgets() 语句看起来不对(也缺少一个 ;)。如果它是循环的一部分,你不能将其与 \0 进行比较以检测失败。 - P.P
这就是我想知道的,非常感谢。 - nocturne
1个回答

20
一个简单的例子,展示了如何使用多个分隔符和潜在的代码改进。请看嵌入式注释以了解说明。
请注意,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;
}

1
这里有一个使用strtok_r的示例,它是strtok的可重入版本。 - P.P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接