Strcmp - 循环而没有输入

时间:2015-03-23 04:49:41

标签: c loops strcmp c-strings

该程序执行以下操作:

  1. 扫描一串文字字符输入[15];
  2. 将其与 char password [] =“1sure”;
  3. 进行比较
  4. 如果字符串不匹配则循环。
  5. 如果字符串匹配则终止。
  6. 程序在字符串不匹配时循环。但是,我还希望程序循环,如果没有输入,用户只需按Enter键。我尝试使用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);
    }
    

4 个答案:

答案 0 :(得分:3)

该程序可以采用以下方式

#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] = '\0';

        if ( input[0] == '\0' )
        {
            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);
}

答案 1 :(得分:2)

scanf和大多数其他说明符一起使用时,%s函数会跳过前导空格。空白包括换行符,因此无法检测到scanf的空行。

相反,您可以使用fgets读取一行。请注意,我添加了错误检查:

if ( ! fgets(input, sizeof input, stdin) )
    break;

不幸的是fgets有一个怪癖,因为它将换行符放入缓冲区,所以你必须删除它;一种方法是:

char *newline = strchr(input, '\n');
if ( newline )
    *newline = '\0';

然后你可以继续strcmp以及你的其余循环。


其他说明:如果您没有收到isgraph(input)的编译器错误,那么您需要弄清楚如何正确调用编译器。该代码是非法的,如果没有显示错误,那么您可能会错过编译器可能告诉您的其他有用信息。

此外,else之后return没有意义。 return语句不能失败。作为循环的最后一行的continue同样是多余的。

答案 2 :(得分:0)

检查scanf的返回值(它应返回1)以继续其余代码

printf("Password: ");
char line[15];
if(fgets(line,15,stdin)!=NULL) {
   if(scanf("%s", input)==1) {
      if(strcmp(password,input)==0) {
   ...
   }
}

答案 3 :(得分:0)

只需检查scanf的返回值。

if ( scanf("%s",input) != 1 )
       continue;
...
...

否则你可以这样做。

while( scanf("%s",input) != 1 )// It will continue the loop until the correct input come.
       continue;