C 使用strtok将字符串拆分为令牌时出现问题-拆分后字符数组为空
我对C语言编程很陌生,我有一个问题,我在过去的几天里一直试图解决这个问题,但现在我不知道该怎么办 我用函数“input”读取一个字符串,每当有空格时,该函数就会被拆分成几个部分。这些部件存储在字符数组中,到目前为止效果良好。 但是,当我在main中调用下一个函数“checkInput”时,char数组再次为空。调用下一个函数时,我必须更改什么,以使字符数组不为空 当我使用scanf而不是fgets时,它起了作用。但是为什么呢 任何帮助都将不胜感激C 使用strtok将字符串拆分为令牌时出现问题-拆分后字符数组为空,c,arrays,string,fgets,strtok,C,Arrays,String,Fgets,Strtok,我对C语言编程很陌生,我有一个问题,我在过去的几天里一直试图解决这个问题,但现在我不知道该怎么办 我用函数“input”读取一个字符串,每当有空格时,该函数就会被拆分成几个部分。这些部件存储在字符数组中,到目前为止效果良好。 但是,当我在main中调用下一个函数“checkInput”时,char数组再次为空。调用下一个函数时,我必须更改什么,以使字符数组不为空 当我使用scanf而不是fgets时,它起了作用。但是为什么呢 任何帮助都将不胜感激 void input(char* string1
void input(char* string1, char* string2, char* string3)
{
char ptr[100];
printf("Enter String: \n");
fgets(ptr, 100, stdin);
printf("%s \n", ptr);
if(ptr != NULL)
{
string1 = strtok(ptr, " \n");
printf("string1: %s \n", string1);
}
if(ptr != NULL)
{
string2 = strtok(NULL, " \n");
printf("string2: %s \n", string2);
}
if(ptr != NULL)
{
string3 = strtok(NULL, " \n \0");
printf("string3: %s \n", string3);
}
}
int main(void)
{
char string1[100];
char string2[100];
char string3[100];
input(string1, string2, string3);
checkInput(string1, string2, string3);
return 0;
}
由于在
main()
中将string1、string2、string3
声明为100个字符的数组,每个字符具有自动存储持续时间,因此已为input()
中的数组提供了存储。要将字符串返回到main()
中并避免input()
中的ptr
存储在input()中变得无效,最简单的方法就是在input()
中对字符串进行strcpy
标记,例如
void input(char* string1, char* string2, char* string3)
{
char ptr[100], *p = ptr;
printf ("Enter String: \n");
fgets (p, 100, stdin);
printf("%s \n", ptr);
if (p != NULL)
{
p = strtok (p, " \n");
if (p)
strcpy (string1, p);
printf("string1: %s \n", string1);
}
if (p != NULL)
{
p = strtok (NULL, " \n");
if (p)
strcpy (string2, p);
printf("string2: %s \n", string2);
}
if (p != NULL)
{
p = strtok (NULL, " \n \0");
if (p)
strcpy (string3, p);
printf("string3: %s \n", string3);
}
}
现在string1、string2和string3将保持有效,直到退出main()
并且程序结束。您的意思是我必须通过引用传递字符数组吗?像void输入(char**string1,char**string2,char string3**)
?我们需要在inputCheck()
中使用的函数的正确定义,比如f.e.IsOperator()
。我发现了一些参考文献,但它们似乎是针对C++的,而不是针对C.@ FR U.chtTeNoY的。如果你想“ping”一个不是OP的用户,你需要在你的评论前面设置<代码> @用户名< /代码>。@ Yunnosch哪些参数是错误的?特别是发生在<代码> Char PTR(100);<代码>当input()
返回时?(提示:ptr
是input()
函数的函数堆栈的一部分,返回时会被销毁(释放以供再次使用)。由于strtok
将在ptr
中返回一个地址到每个令牌的开头,因此字符串将指向函数返回后不再有效的内存。如果使用了scanf(“%99[^\n]”,ptr)代码>而不是fgets(ptr,100,标准输入)你说“它有效”——欢迎来到未定义行为的世界。。。