如果以字符串格式输入无效选项,则程序不要求新条目

时间:2018-03-10 13:37:38

标签: c

我在理解如何让我的 "scripts": { "clean": "npm cache clean --force", "clean:complete": "npm run clean && npm uninstall -g @angular/cli && rmdir /Q /S node_modules", "clean:complete:install": "npm run clean:complete && npm i -g @angular/cli && npm i && npm install --save-dev @angular/cli@latest" } 循环只是输出一条消息“输入无效”并向用户询问新问题时遇到问题,除非他选择了数字while或{列表中的{1}}。如果您输入:1而不是整数,程序永远不会停止循环,会发生什么。

我想要的是让程序告诉用户从2输入一个新号码而不是简单地停止运行我可以通过将切换中的默认值设置为asdas来实现或1-2

例如:

CMD说输入exit(0);用户输入:runSystem = false;(永不停止循环),就像当前情况一样。

我想要的是:1-2然后它会说“输入新的选择”并等待正确答案。

让我烦恼的是,如果你输入一个无效的数字,例如:asdaf并且要求输入一个新的条目,程序将按照我的意愿执行,但它不适用于字符串输入。

代码:

asdf

2 个答案:

答案 0 :(得分:1)

有效C编译器不允许在options内声明函数main

使该函数返回输入并将返回值传递给switch。另外,为了停止while循环case 2:,应将runSystem更改为false;

  

输入:asdas而不是整数,程序永远不会停止循环。

这是因为当scanf("%d", &userinput);失败时,它没有更新变量userinput

检查标准7.21.6.4 The scanf function

您可以阅读scanf的行为  here

成功时,scanf返回成功读取的项目数。如果发生匹配故障,此计数可以匹配预期的读数或更少,甚至为零。如果在成功读取任何数据之前输入失败,则返回EOF

知道您可以检查scanf的返回值并做出适当的决定。提出的解决方案吃掉了坏人。

#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>

int options(void) {

    int c;   
    int ret;
    int x = 0;
    int error = 0;
    printf("<========Welcome to the program, please make a choice========> \n\n");

    printf("1: Say Hello\n");
    printf("2: Say GoodBye\n");

    printf("Please enter a choice:");

    while(1)
    {
        c = '0';

        if(!error)
            printf("Input a number:\n");
        else
           error = 0;

        ret = scanf("%d", &x);

        if(ret == EOF) {
            return 2; // END OF PROGRAM
        }
        else
        {
            if (ret == 1){
                return x;
            }
            else  // NOT a number
            {
                printf("No letters! Input a number:\n");
                do
                {
                    c = getchar();
                    if(c == EOF)
                       return 2; // END OF PROGRAM
                }
                while (!isdigit(c) && c!='\n');

                ungetc(c, stdin);
                error = 1;
            }
        }
    }
}

int main(void) {

   int userinput;
   int runSystem = true;

   while (runSystem) {

        userinput = options();
        switch(userinput) {

            case 1: printf("Hello!\n");
            break;

            case 2: printf("GoodBye!\n");
                runSystem = false;
            break;

            default: 
            case 3: printf("Invalid, try again\n");
            break;
        }
    }
    return 0;
}

输出:

<========Welcome to the program, please make a choice========>                                                                                

1: Say Hello                                                                                                                                  
2: Say GoodBye                                                                                                                                
Please enter a choice:Input a number:                                                                                                         
X                                                                                                                                             
No letters! Input a number:                                                                                                                   
a                                                                                                                                             
No letters! Input a number:                                                                                                                   
1                                                                                                                                             
Hello!                                                                                                                                        
<========Welcome to the program, please make a choice========>                                                                                

1: Say Hello                                                                                                                                  
2: Say GoodBye                                                                                                                                
Please enter a choice:Input a number:                                                                                                         
7                                                                                                                                             
Invalid, try again                                                                                                                            
<========Welcome to the program, please make a choice========>                                                                                

1: Say Hello                                                                                                                                  
2: Say GoodBye                                                                                                                                
Please enter a choice:Input a number:                                                                                                         
2                                                                                                                                             
GoodBye!               

答案 1 :(得分:1)

scanf("%d", &userinput);需要int作为输入。当您提供非整数时,scanf()不会将其分配给userinput

检查scanf()的返回值,看它是否成功。它返回它所做的成功分配的数量。

当您输入一个字符串作为输入时,scanf()将不接受它并将其保留在未使用的输入缓冲区中。

再次执行scanf()时,输入缓冲区中仍然存在无效输入,这是第二个scanf()尝试读取的内容。同样的事情发生了,这继续下去。这就是你无限循环背后的原因。

要解决此问题,您应在case 3中显示消息后使用输入缓冲区中的无效输入。做点什么

int ch;
while( (ch=getchar())!='\n' && ch!=EOF );

这将从输入缓冲区消耗,直到遇到\n。 <{3}}失败时返回EOF

编辑:标准C不允许嵌套函数定义。你没有得到错误的原因可能是因为你的编译器允许它作为扩展。但它可能不适用于其他编译器。

请参阅getchar()this

您可以将options()的定义放在while循环中调用它,或者将userinput的值作为返回值或通过指向传递给函数的变量的指针。