如何在C中拆分字符串?
如果我有一个字符串,比如:如何在C中拆分字符串?,c,string,algorithm,C,String,Algorithm,如果我有一个字符串,比如: const char* mystr = "Test Test Bla Bla \n Bla Bla Test \n Test Test \n"; 如何使用换行符“\n”将字符串拆分为字符串数组 我试图在C中完成,字符串。C或Boost的字符串算法中的S拆股确实在C++中执行。< P>试着使用Strutk函数。请注意,它会修改源内存,因此不能将其与字符串文字一起使用 char *copy = strdup(mystr); char *tok; tok = strto
const char* mystr = "Test Test Bla Bla \n Bla Bla Test \n Test Test \n";
如何使用换行符“\n”将字符串拆分为字符串数组
我试图在C中完成,字符串。C或Boost的字符串算法中的S拆股确实在C++中执行。
< P>试着使用Strutk函数。请注意,它会修改源内存,因此不能将其与字符串文字一起使用char *copy = strdup(mystr);
char *tok;
tok = strtok(copy, "\n");
/* Do something with tok. */
while (tok) {
tok = strtok(NULL, "\n");
/* ... */
}
free(copy);
尝试使用strtok函数。请注意,它会修改源内存,因此不能将其与字符串文字一起使用
char *copy = strdup(mystr);
char *tok;
tok = strtok(copy, "\n");
/* Do something with tok. */
while (tok) {
tok = strtok(NULL, "\n");
/* ... */
}
free(copy);
在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并没有作为标准库的一部分提供这样做的简单解决方案。在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并没有作为标准库的一部分提供一个简单的解决方案。请记住,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 */
请记住,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 */
您可以使用下面提到的库。它还有许多其他有用的功能
或者您可以使用strtok函数。您可以使用下面提到的库。它还有许多其他有用的功能
或者你可以使用strtok函数。在上面的反应中,我只看到while{}循环,其中{}循环的IMHO更紧凑 cnicutar:
for(tok = strtok(copy, "\n");tok; tok = strtok(NULL, "\n") {
/* ... */
}
致命错误:
char *word;
for ( word = strtok(mystr, " \n");word; word = strtok(NULL, " \n") {
printf("word: %s\n", word);
}
扎克:
[最后一个例子的清晰性是有争议的]在上述反应中,我只看到当{}循环时,{}循环的IMHO更紧凑 cnicutar:
for(tok = strtok(copy, "\n");tok; tok = strtok(NULL, "\n") {
/* ... */
}
致命错误:
char *word;
for ( word = strtok(mystr, " \n");word; word = strtok(NULL, " \n") {
printf("word: %s\n", word);
}
扎克:
[最后一个例子的清晰度有争议]@IntermediateHacker补充道。“没有测试它,请随意指出错误。手动和示例@user411313,但可以使用malloc和strcpy轻松实现。”MediateHacker补充道。没有测试它,请随意指出错误。Manual和example@user411313,但是可以使用malloc和strcpy.C或C轻松实现它?你的问题的标题要求用C语言解决,但你的回答暗示了你需要C语言解决的语法错误。Strtok C和C都有字符串。split@DarkStar1对不起,我打错了,我打字很匆忙C或C的可能副本?你的问题的标题要求用C语言解决,但你的回答暗示了你需要C语言解决的语法错误。Strtok C和C都有字符串。split@DarkStar1对不起,我打错了,我打字很匆忙可能重复供参考,如果代码示例在列表中,您必须将其缩进八个空格。谢谢提示!对于它为什么不起作用,我的脑海里有一瞬间融化了,所以我在hline中读了一遍:。仅供参考,如果代码示例在列表中,您必须将其缩进八个空格。谢谢您的提示!对于为什么它不起作用,我的脑海里有一瞬间融化了,所以我在hline中读了一遍:。我特别使用了while循环,因为我认为当需要初始化一大堆变量时,for循环更难阅读。我的意思是,伙计,你把一个变量初始化放在一个数组索引里面。这确实是有问题的。但是,将所有的循环机制集中在for行中要比将p++或i++分散在循环体的末尾更可读,IMHO。我特别使用了while循环,因为我认为当你
需要初始化一大堆变量。我的意思是,伙计,你把一个变量初始化放在一个数组索引里面。这确实是有问题的。但是,将所有的循环机制集中在for行中要比将分散的p++或i++放在循环体的末尾易读得多,IMHO。