Strcmp — 无输入时循环
Strcmp — loop while no input
该程序执行以下操作:
- 扫描一串文本char input[15];
- 将其与 char password[ ] = "1sure";
进行比较
- 如果字符串不匹配则循环。
- 如果字符串匹配则终止。
字符串不匹配时程序循环。但是,我还希望程序 在没有输入 且用户只需按回车键时循环。我尝试使用 isgraph
函数,但这会导致程序崩溃。我在代码中评论了该部分。有人可以建议如何在没有输入的情况下让程序循环吗?
#include <stdio.h>
#include <string.h>
int main()
{
char password[] = "1sure";
char input[15];
do
{
printf("Password: ");
scanf("%s", input);
if(strcmp(password,input)==0)
{
printf("Password accepted.");
putchar('\n');
return(0);
}
/*else if(isgraph(input)==0)
{
printf("No input detected."); //Program crashes with this segment.
continue;
}*/
else
{
printf("\nInvalid password.\n");
continue;
}
}
while(1);
}
检查 scanf 的 return 值(它应该 return 1)以继续代码的其余部分
printf("Password: ");
char line[15];
if(fgets(line,15,stdin)!=NULL) {
if(scanf("%s", input)==1) {
if(strcmp(password,input)==0) {
...
}
}
只需检查 scanf
的 return 值。
if ( scanf("%s",input) != 1 )
continue;
...
...
否则你也可以这样做。
while( scanf("%s",input) != 1 )// It will continue the loop until the correct input come.
continue;
scanf
函数在与 %s
和大多数其他说明符一起使用时会跳过前导空格。空白包含换行符,因此无法使用 scanf
检测空行。
相反,您可以使用 fgets 读取一行。请注意,我添加了错误检查:
if ( ! fgets(input, sizeof input, stdin) )
break;
不幸的是,fgets
有一个怪癖,它将换行符放入缓冲区,因此您必须将其删除;一种方法是:
char *newline = strchr(input, '\n');
if ( newline )
*newline = '[=11=]';
然后您可以继续 strcmp
和循环的其余部分。
其他注意事项:如果您没有收到 isgraph(input)
的编译器错误,那么您需要了解如何正确调用编译器。该代码是非法的,如果没有显示错误,那么您可能会错过编译器可能会告诉您的其他有用信息。
此外,在 return
之后有 else
是没有意义的。 return 语句不能失败。 continue
作为循环的最后一行同样是多余的。
程序可能如下所示
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main( void )
{
char password[] = "1sure";
char input[15];
do
{
printf("\nPassword: ");
if ( fgets( input, sizeof( input ), stdin ) == NULL )
{
printf( "An error occured or input was interrupted\n" );
return 0;
}
size_t n = strlen( input );
while ( n && isspace( input[n-1] ) ) input[--n] = '[=10=]';
if ( input[0] == '[=10=]' )
{
printf("No input detected.\n");
continue;
}
else if( strcmp( password, input ) == 0 )
{
printf("Password accepted.\n");
return(0);
}
else
{
printf("\nInvalid password.\n");
continue;
}
} while(1);
}
该程序执行以下操作:
- 扫描一串文本char input[15];
- 将其与 char password[ ] = "1sure"; 进行比较
- 如果字符串不匹配则循环。
- 如果字符串匹配则终止。
字符串不匹配时程序循环。但是,我还希望程序 在没有输入 且用户只需按回车键时循环。我尝试使用 isgraph
函数,但这会导致程序崩溃。我在代码中评论了该部分。有人可以建议如何在没有输入的情况下让程序循环吗?
#include <stdio.h>
#include <string.h>
int main()
{
char password[] = "1sure";
char input[15];
do
{
printf("Password: ");
scanf("%s", input);
if(strcmp(password,input)==0)
{
printf("Password accepted.");
putchar('\n');
return(0);
}
/*else if(isgraph(input)==0)
{
printf("No input detected."); //Program crashes with this segment.
continue;
}*/
else
{
printf("\nInvalid password.\n");
continue;
}
}
while(1);
}
检查 scanf 的 return 值(它应该 return 1)以继续代码的其余部分
printf("Password: ");
char line[15];
if(fgets(line,15,stdin)!=NULL) {
if(scanf("%s", input)==1) {
if(strcmp(password,input)==0) {
...
}
}
只需检查 scanf
的 return 值。
if ( scanf("%s",input) != 1 )
continue;
...
...
否则你也可以这样做。
while( scanf("%s",input) != 1 )// It will continue the loop until the correct input come.
continue;
scanf
函数在与 %s
和大多数其他说明符一起使用时会跳过前导空格。空白包含换行符,因此无法使用 scanf
检测空行。
相反,您可以使用 fgets 读取一行。请注意,我添加了错误检查:
if ( ! fgets(input, sizeof input, stdin) )
break;
不幸的是,fgets
有一个怪癖,它将换行符放入缓冲区,因此您必须将其删除;一种方法是:
char *newline = strchr(input, '\n');
if ( newline )
*newline = '[=11=]';
然后您可以继续 strcmp
和循环的其余部分。
其他注意事项:如果您没有收到 isgraph(input)
的编译器错误,那么您需要了解如何正确调用编译器。该代码是非法的,如果没有显示错误,那么您可能会错过编译器可能会告诉您的其他有用信息。
此外,在 return
之后有 else
是没有意义的。 return 语句不能失败。 continue
作为循环的最后一行同样是多余的。
程序可能如下所示
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main( void )
{
char password[] = "1sure";
char input[15];
do
{
printf("\nPassword: ");
if ( fgets( input, sizeof( input ), stdin ) == NULL )
{
printf( "An error occured or input was interrupted\n" );
return 0;
}
size_t n = strlen( input );
while ( n && isspace( input[n-1] ) ) input[--n] = '[=10=]';
if ( input[0] == '[=10=]' )
{
printf("No input detected.\n");
continue;
}
else if( strcmp( password, input ) == 0 )
{
printf("Password accepted.\n");
return(0);
}
else
{
printf("\nInvalid password.\n");
continue;
}
} while(1);
}