你如何在C中拆分字符串?

时间:2012-01-29 17:42:24

标签: c string algorithm

如果我有一个字符串:

const char* mystr = "Test Test Bla Bla \n Bla Bla Test \n Test Test \n";

如何使用换行符'\ n'将字符串拆分为字符串数组?

我正在尝试用C语言完成,string.Split()在C#中执行的操作或者在C ++中使用boost的字符串算法split

5 个答案:

答案 0 :(得分:8)

尝试使用strtok功能。请注意,它会修改源内存,因此您无法将其与字符串文字一起使用。

char *copy = strdup(mystr);
char *tok;

tok = strtok(copy, "\n");
/* Do something with tok. */
while (tok) {
    tok = strtok(NULL, "\n");
    /* ... */
}

free(copy);

答案 1 :(得分:3)

在C语言中分割字符串的最简单方法是使用strtok(),但是它附带了一个关于其用法的警告长度列表:

  1. 它具有破坏性(破坏输入字符串),你无法在上面的字符串中使用它。
  2. 它不是可重入的(它在调用之间保持其状态,并且你一次只能使用它来标记一个字符串...更不用说如果你想将它与线程一起使用)。一些系统提供可重入的版本,例如, strtok_r()。您的示例可能会分开:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main (void) {
      char mystr[] = "Test Test Bla Bla \n Bla Bla Test \n Test Test \n";
      char *word = strtok(mystr, " \n");
    
       while (word) {
          printf("word: %s\n", word);
          word = strtok(NULL, " \n");
       }
    
       return 0;
    }
    
  3. 请注意字符串声明的重要更改 - 它现在是一个数组,可以修改。当然,可以在不破坏字符串的情况下对字符串进行标记,但C不会为标准库的一部分提供简单的解决方案。

答案 2 :(得分:1)

请记住,C让您手动完成所有内存分配。还要记住,C实际上没有字符串,只有字符数组。此外,字符串文字是不可变的,因此您需要复制它。首先复制整个内容会更容易。

所以,像这样(完全未经测试):

char *copy = xstrdup(mystr);
char *p;
char **arry;
size_t count = 0;
size_t i;

for (p = copy; *p; p++)
  if (*p == '\n')
    count++;

arry = xmalloc((count + 1) * sizeof(char *));

i = 0;
p = copy;
arry[i] = p;
while (*p)
{
  if (*p == '\n')
  {
    *p = '\0';
    arry[i++] = p+1;
  }
  p++;
}

return arry; /* deallocating arry and arry[0] is 
                the responsibility of the caller */

答案 3 :(得分:1)

在上面的反应中,我只看到while(){}循环,其中IMHO for(){}循环更紧凑。

cnicutar:

for(tok = strtok(copy, "\n");tok; tok = strtok(NULL, "\n") {
    /* ... */
}

FatalError:

char *word;
for ( word = strtok(mystr, " \n");word; word = strtok(NULL, " \n") {
   printf("word: %s\n", word);
}

扎克:

for (arry[i=0]=p=copy; *p ; p++)
{
  if (*p == '\n')
  {
    *p = '\0';
    arry[i++] = p+1;
  }
}

[最后一个例子的清晰度是有争议的]

答案 4 :(得分:-2)

您可以使用下面提到的库。它还有许多其他有用的功能。

http://www.boost.org/doc/libs/1_48_0/libs/tokenizer/index.html

或者你可以使用strtok功能。