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

问题描述 投票:0回答:4

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

}
c
4个回答
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
投票

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

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

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


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;
}

0
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.