Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中拆分字符串?_C_String_Algorithm - Fatal编程技术网

如何在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。