如果我有一个字符串:
const char* mystr = "Test Test Bla Bla \n Bla Bla Test \n Test Test \n";
如何使用换行符'\ n'将字符串拆分为字符串数组?
我正在尝试用C语言完成,string.Split()
在C#中执行的操作或者在C ++中使用boost的字符串算法split
。
答案 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()
,但是它附带了一个关于其用法的警告长度列表:
它不是可重入的(它在调用之间保持其状态,并且你一次只能使用它来标记一个字符串...更不用说如果你想将它与线程一起使用)。一些系统提供可重入的版本,例如, 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;
}
请注意字符串声明的重要更改 - 它现在是一个数组,可以修改。当然,可以在不破坏字符串的情况下对字符串进行标记,但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功能。