C:将字符串拆分为带分隔符的字符串数组&&&引用;

C:将字符串拆分为带分隔符的字符串数组&&&引用;,c,arrays,string,C,Arrays,String,我是C语言的新手,所以我需要帮助。 我需要用分隔符“&&”将字符串拆分为字符串数组, 问题是我试图使用strtok,但是当我使用它时,如果字符串中的某个位置是“&”,则strtok似乎无法正确处理 我知道&&之间的每个部分最多256个字符,最多16个部分。 所以我需要创建一个数组arr[16][256]或一个大小为16*256的数组。 在任何情况下,每次尝试我的代码时,都会在与之间的不同位置失败&& 例如: char arr[16][255]; char stringToSpli

我是C语言的新手,所以我需要帮助。 我需要用分隔符“&&”将字符串拆分为字符串数组, 问题是我试图使用
strtok
,但是当我使用它时,如果字符串中的某个位置是“&”,则
strtok
似乎无法正确处理

我知道&&之间的每个部分最多256个字符,最多16个部分。 所以我需要创建一个数组
arr[16][256]
或一个大小为16*256的数组。 在任何情况下,每次尝试我的代码时,都会在与之间的不同位置失败&&

例如:

    char arr[16][255];
    char stringToSplit = "Hello World && How are u doing && more words & bla &";
输出:

    arr[0] = "Hello World ";
    arr[1] = " How are u doing ";
    arr[2] = " more words & bla &";
谢谢你

这就是我所尝试的:

  int i;
  char *p;
  i = 0;
  p = strtok (stringToSplit ,"&&");
  while (p != NULL)
  {
    arr[i++] = p;
    p = strtok (NULL, "&&");
  }
  for (i=0;i<16; ++i)
    printf("%s\n", arr[i]);
inti;
char*p;
i=0;
p=STROTOK(stringToSplit,&&);
while(p!=NULL)
{
arr[i++]=p;
p=strtok(空,&&&);
}
for(i=0;i
strtok()
按字符拆分字符串


您需要在字符串中找到一个字符串,然后将相关字符复制到目标。继续执行此操作,直到源字符串耗尽。

简单的双嵌套循环即可。请检查“&&”,并注意长的子字符串和太多的子字符串

void  tubu13(void) {
  #define NUM (16)
  #define SIZ (255+1)

  char arr[NUM][SIZ];
  const char *stringToSplit = "Hello World && How are u doing && more words & bla &";

  const char *p = stringToSplit;
  int n, len;
  for (n = 0; n < NUM; n++) {
    for (len=0; len < SIZ-1; len++) {
      if (p[0] == '\0') {
        break;
      }
      if (p[0] == '&' && p[1] == '&') {
        p += 2;
        break;
      }
      arr[n][len] = *p;
      p++;
    }
    arr[n][len] = '\0';
    printf("  arr[%d] = \"%s\";\n", n, arr[n]);
  }
}

arr[0] = "Hello World ";
arr[1] = " How are u doing ";
arr[2] = " more words & bla &";
arr[3] = "";
...
arr[15] = "";
void tubu13(void){
#定义NUM(16)
#定义大小(255+1)
字符arr[NUM][SIZ];
const char*stringToSplit=“你好,世界&&你好&&more words&bla&”;
const char*p=stringToSplit;
int n,len;
对于(n=0;n
#包括
#包括
char*strtokByWord\u r(char*str,const char*word,char**store){
字符*p,*ret;
如果(str!=NULL){
*store=str;
}
if(*store==NULL)返回NULL;
p=strstr(ret=*存储,字);
如果(p){
*p='\0';
*store=p+strlen(字);
}否则{
*store=NULL;
}
返回ret;
}
char*strtokByWord(char*str,const char*word){
静态字符*存储=NULL;
返回strtokByWord\u r(str、word和store);
}
int main(){
字符arr[16][255];
char stringToSplit[]=“你好,世界&&你好&&more words&bla&;”;
inti,n;
char*p;
i=0;
p=STROTOKBYWORD(stringToSplit,&&&);
while(p!=NULL){
strcpy(arr[i++],p);
p=strtokByWord(空,&&&);
}
n=i;

对于(i=0;i
strotok
不处理此问题,因为您正在传递
stringToSplit
指向字符串文字且
strotok
修改您传递到的字符串。请阅读。向我们展示您尝试的内容*字符串正在运行…查看编辑:)另一个问题是strtok只使用给定分隔符字符串中的任何单个字符进行标记。因此传递它“&&”与传递它“&”没有什么区别。您可能需要编写自己的标记化函数,这并没有那么困难。或者我尝试了一下,它成功了。但问题是,我在每个索引的末尾都有一些未知字符。arr[0]是“Hello world@H”您需要通过在最后一个位置写入
'\0'
来正确终止所有字符串。如何找到最后一个索引?
strlen()
没有给出正确的字符串长度…最后一个索引是下一次出现的
“&&&&”
的(相对)位置。
#include <stdio.h>
#include <string.h>

char *strtokByWord_r(char *str, const char *word, char **store){
    char *p, *ret;
    if(str != NULL){
        *store = str;
    }
    if(*store == NULL) return NULL;
    p = strstr(ret=*store, word);
    if(p){
        *p='\0';
        *store = p + strlen(word);
    } else {
        *store = NULL;
    }
    return ret;
}
char *strtokByWord(char *str, const char *word){
    static char *store = NULL;
    return strtokByWord_r(str, word, &store);
}

int main(){
    char arr[16][255];
    char stringToSplit[] = "Hello World && How are u doing && more words & bla &";
    int i, n;
    char *p;
    i = 0;
    p = strtokByWord(stringToSplit, "&&");
    while (p != NULL){
        strcpy(arr[i++], p);
        p = strtokByWord(NULL, "&&");
    }
    n = i;
    for (i=0;i<n; ++i)
        printf("%s\n", arr[i]);
    return 0;
}