C程序 - 如何拒绝任何非数字输入

时间:2018-03-01 23:19:27

标签: c

我刚刚开始学习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;

}

4 个答案:

答案 0 :(得分:3)

检查返回值,而不是检查值是否与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;
}

答案 1 :(得分:1)

对于C新手来说,这不是一个糟糕的方法。一个小的改进是实际检查scanf()的返回值,因为它返回成功检索的参数数量。然后,您可以放弃依赖num0来表明输入有效。除非您确实希望将0明确标记为无效输入。

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

ret == 1意味着整数被成功地读入numret == 0意味着它不是。

答案 2 :(得分:1)

考虑使用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;
}

答案 3 :(得分:0)

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

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

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

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

并检查ret是否成功或失败。