【问题标题】:C Program - How to deny any non-numerical inputC 程序 - 如何拒绝任何非数字输入
【发布时间】:2018-03-01 23:19:26
【问题描述】:

我刚刚开始学习 C 语言,如果您知道实现以下目标的更好方法,我希望您能帮助我清理/简化我的代码。

我想要一个程序询问一个数字,如果找到然后继续打印并结束,但是如果放入其他任何东西(例如字母键),那么我希望程序循环询问一个数字直到给出一个。

我开始使用一个简单的 scanf 输入命令,但是当我尝试检查是否输入了有效数字(如我们定义的那样)时,这似乎进入了无限循环。

所以相反,我已经结束了这个,从网上玩/看,但我很想知道是否有任何更有效的方法!

//
//  Name & Age Program
//  Created by Ben Warren on 1/3/18.
//


#include <stdio.h>
int main (void)
{

    //Setting up variables
    int num;
    char line[10]; /* this is for input */



    //Collecting input
    printf("Please enter any number? \t");
    scanf("%d", &num);


    //If Invalid input
    while (num==0)
    {
        printf("\nTry again:\t");
        fgets(line, 10, stdin); //turning input into line array
        sscanf(line, "%d",&num); //scaning for number inside line and storing it as 'num'
        if (num==0) printf("\nThat's not an number!");
    }


    //If Valid input
    {
        printf("\n%d is nice number, thank you! \n\n", num);
    *}*


    return 0;

}

【问题讨论】:

  • 有一个名为 codereview 的专门 Stackexchange-Site 更适合这个问题。
  • 有很多关于“如何确保只输入整数”(或浮点数)的问题。简单的“scanf()”格式通常不是答案之一。

标签: c


【解决方案1】:

不是检查值是否不为0,而是检查返回值 sscanf。它返回它进行的转换次数。在你的情况下它应该是 1。除非返回值是 1,否则一直要求一个数字。

#include <stdio.h>

int main(void)
{
    int ret, num;
    char line[1024];

    do {
        printf("Enter a number: ");
        fflush(stdout);

        if(fgets(line, sizeof line, stdin) == NULL)
        {
            fprintf(stderr, "Cannot read from stdin anymore\n");
            return 1;
        }

        ret = sscanf(line, "%d", &num);

        if(ret != 1)
            fprintf(stderr, "That was not a number! Try again.\n");

    } while(ret != 1);

    printf("The number you entered is: %d\n", num);

    return 0;
}

【讨论】:

    【解决方案2】:

    对于刚接触 C 的人来说,这不是一个坏方法。一个小的改进是实际检查 scanf() 的返回值,因为它返回成功检索的参数数量。然后你就可以摆脱依赖num0 来表明输入是有效的。除非您确实想特别将 0 标记为无效输入。

    int ret = scanf("%d", &num);
    

    ret == 1 表示整数已成功读入numret == 0 表示未成功。

    【讨论】:

    • “如果在 ... 中放入任何其他内容,那么我希望程序循环”并且 scanf("%d", &amp;num) 不会消耗非数字输入,从而导致解决方案不完整。 OP 对fgets(); sscanf(); 的使用需要工作,但比scanf() 更接近工作解决方案。
    【解决方案3】:

    考虑使用strtol 将字符串解析为long int。这也允许您检测尾随字符。在此示例中,如果尾随字符不是换行符,则可以拒绝输入。 strtol 也可以检测溢出值。阅读文档以了解其工作原理。

    #include <stdio.h>
    #include <stdlib.h>
    int main (void)
    {
        //Setting up variables
        long int num = 0;
        char line[40] = ""; /* this is for input */
        char *parsed = NULL;
    
        printf("Please enter any number? \t");
        fflush ( stdout);
        while ( fgets(line, 40, stdin))
        {
            parsed = line;//set parsed to point to start of line
            num = strtol ( line, &parsed, 10);
            if ( parsed == line) {//if parsed equals start of line there was no integer
                printf("Please enter a number? \t");
                printf("\nTry again:\t");
                fflush ( stdout);
                continue;
            }
            if ( '\n' != *parsed) {//if the last character is not a newline reject the input
                printf("Please enter only a number? \t");
                printf("\nTry again:\t");
                fflush ( stdout);
            }
            else {
                break;
            }
        }
        if ( !parsed || '\n' != *parsed) {
            fprintf ( stderr, "problem fgets\n");
            return 0;
        }
        printf("\n%ld is nice number, thank you! \n\n", num);
    
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      0(零)是一个数字...

      但我知道你想做什么...... 您可以使用isdigit 或类似功能的组合来检查有效号码

      我认为遵循其他答案的建议以使用 scanf 的返回值使用以下代码也很重要:

      int ret = scanf("%d", &num);
      

      并检查ret scanf 的成功或失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 2015-06-21
        相关资源
        最近更新 更多