我如何重新扫描字符串,以防止无限while循环?



该代码旨在接收两个字符串,中间有一个逗号。但我一直遇到的问题是,在第一个输入之后,例如"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;
}

请注意,虽然输入的字符串可以包含逗号,但第二个单词可以为空。您还应该添加这样的检查,以确定第二个单词是否为空。

最新更新