该代码旨在接收两个字符串,中间有一个逗号。但我一直遇到的问题是,在第一个输入之后,例如"Jill, allen",它会重复使用该输入,直到我得到一个错误。变量' fulllinpt '首先是一个数组,我将其更改为const,以便通过手动将其更改为"q"这样程序就会停止。此外,打印' fulllinpt '的行也意味着通过检查它存储的内容来进行测试,之后我将尝试通过输入或代码更改它。我在zybooks中运行它,但我在Code::blocks IDE上测试了它,并确保即使在那里问题仍然存在。
其他可能的输入包括:"吉尔,艾伦。"吉尔,艾伦"吉尔·艾伦">
当涉及到解析字符串时,我似乎没有问题,主要是扫描新的输入。但我欢迎任何形式的建议,因为C对我来说仍然是新的。提前感谢!
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main(void) {
const int USER_TEXT_LIMIT = 100;
char fullInpt[USER_TEXT_LIMIT];
char str1[20];
char str2[20];
bool inputDone;
while(!inputDone) {
printf("Enter input string:n");
fgets(fullInpt, USER_TEXT_LIMIT, stdin);
printf("%s", fullInpt);
if(strcmp(fullInpt, "q") == 0) {
inputDone = true;
}
else if(strchr(fullInpt, ',') == NULL) {
printf("Error: No comma in string.n");
printf("n");
}
else {
sscanf(fullInpt, "%20[^,] , %20s", str1, str2);
printf("First word: %sn", str1);
printf("Second word: %sn", str2);
printf("n");
}
}
return 0;
}
指针fullInpt
未初始化,并且具有限定符const
char const *fullInpt;
所以这个scanf
调用scanf("%[^n]s", fullInpt);
调用未定义行为。
格式字符串"%[^n]s"
错误
变量inputDone
也未初始化。
bool inputDone;
那么while循环
while(!inputDone) {
再次调用未定义行为。
程序可以按照以下方式查找示例
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main(void)
{
enum { N = 20 };
char fullInpt[2 * N];
char str1[N];
char str2[N];
bool inputDone = false;
do
{
printf( "Enter input string: " );
scanf( " %39[^n]", fullInpt );
printf( "%sn", fullInpt );
if ( strcmp( fullInpt, "q") == 0 )
{
inputDone = true;
}
else if ( strchr( fullInpt, ',' ) == NULL )
{
printf( "Error: No comma in string.n");
printf("nn");
}
else
{
sscanf( fullInpt, "%19[^,] , %19s", str1, str2 );
printf( "First word: %sn", str1 );
printf( "Second word: %sn", str2 );
printf("nn");
}
} while ( !inputDone )
return 0;
}
如果使用可变长度数组,代码会更安全。例如
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main(void)
{
enum { N = 40 };
char fullInpt[N];
bool inputDone = false;
do
{
printf( "Enter input string: " );
scanf( " %39[^n]", fullInpt );
printf( "%sn", fullInpt );
if ( strcmp( fullInpt, "q") == 0 )
{
inputDone = true;
}
else
{
char *p = strchr( fullInpt, ',' );
if ( p == NULL )
{
printf( "Error: No comma in string.n");
printf("nn");
}
else
{
char str1[p - fullInpt + 1];
char str2[strlen( p + 1 ) + 1];
sscanf( fullInpt, "%[^,] , %s", str1, str2 );
printf( "First word: %sn", str1 );
printf( "Second word: %sn", str2 );
printf("nn");
}
}
} while ( !inputDone )
return 0;
}
请注意,虽然输入的字符串可以包含逗号,但第二个单词可以为空。您还应该添加这样的检查,以确定第二个单词是否为空。