使用 strtok 将字符串拆分为标记的问题 - 拆分后字符数组为空
Problem with splitting string into tokens with strtok - Char arrays are empty after splitting
我是 C 语言编程的新手,最近几天我一直在努力解决一个问题,但现在我不知道该怎么做。
我正在读取一个带有函数 "input" 的字符串,每当出现白色 space 时,它就会被拆分成多个部分。这些部分存储在 char 数组中,到目前为止工作正常。
但是,当我在 main 中调用下一个函数 "checkInput" 时,char 数组再次为空。我需要更改什么,以便在调用下一个函数时 char 数组不为空?
当我使用 scanf 而不是 fgets 时,它起作用了。但是为什么?
如有任何帮助,我们将不胜感激。
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 [=10=]");
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 个字符的数组,每个字符具有 自动存储持续时间 ,因此已经为 中的数组提供了存储=13=]。要使 main()
中的字符串恢复并避免 input()
中 ptr
的存储问题在 return 上变得无效,最简单的方法就是 strcpy
input()
中字符串的标记,例如
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 [=10=]");
if (p)
strcpy (string3, p);
printf("string3: %s \n", string3);
}
}
现在 string1, string2
和 string3
将保持有效,直到您退出 main()
并且您的程序结束。
我是 C 语言编程的新手,最近几天我一直在努力解决一个问题,但现在我不知道该怎么做。
我正在读取一个带有函数 "input" 的字符串,每当出现白色 space 时,它就会被拆分成多个部分。这些部分存储在 char 数组中,到目前为止工作正常。 但是,当我在 main 中调用下一个函数 "checkInput" 时,char 数组再次为空。我需要更改什么,以便在调用下一个函数时 char 数组不为空?
当我使用 scanf 而不是 fgets 时,它起作用了。但是为什么?
如有任何帮助,我们将不胜感激。
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 [=10=]");
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 个字符的数组,每个字符具有 自动存储持续时间 ,因此已经为 中的数组提供了存储=13=]。要使 main()
中的字符串恢复并避免 input()
中 ptr
的存储问题在 return 上变得无效,最简单的方法就是 strcpy
input()
中字符串的标记,例如
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 [=10=]");
if (p)
strcpy (string3, p);
printf("string3: %s \n", string3);
}
}
现在 string1, string2
和 string3
将保持有效,直到您退出 main()
并且您的程序结束。