C:将字符串拆分为带分隔符的字符串数组&&&引用;
我是C语言的新手,所以我需要帮助。 我需要用分隔符“&&”将字符串拆分为字符串数组, 问题是我试图使用C:将字符串拆分为带分隔符的字符串数组&&&引用;,c,arrays,string,C,Arrays,String,我是C语言的新手,所以我需要帮助。 我需要用分隔符“&&”将字符串拆分为字符串数组, 问题是我试图使用strtok,但是当我使用它时,如果字符串中的某个位置是“&”,则strtok似乎无法正确处理 我知道&&之间的每个部分最多256个字符,最多16个部分。 所以我需要创建一个数组arr[16][256]或一个大小为16*256的数组。 在任何情况下,每次尝试我的代码时,都会在与之间的不同位置失败&& 例如: char arr[16][255]; char stringToSpli
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;istrtok()
按字符拆分字符串
您需要在字符串中找到一个字符串,然后将相关字符复制到目标。继续执行此操作,直到源字符串耗尽。简单的双嵌套循环即可。请检查“&&”,并注意长的子字符串和太多的子字符串
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;istrotok
不处理此问题,因为您正在传递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;
}