C语言 如何检查输入是否为C中的数字?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/17292545/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 06:47:20  来源:igfitidea点击:

how to check if the input is a number or not in C?

ctypes

提问by user2131316

In the main function of C:

在 C 的主函数中:

void main(int argc, char **argv)
{
   // do something here
}

In the command line, we will type any number for example 1or 2as input, but it will be treated as char array for the parameter of argv, but how to make sure the input is a number, in case people typed helloor c?

在命令行中,我们将输入任何数字作为 example12作为输入,但它会被视为 argv 参数的 char 数组,但是如何确保输入是数字,以防人们输入helloc

回答by Kranthi Kumar

Another way of doing it is by using isdigit function. Below is the code for it:

另一种方法是使用 isdigit 函数。下面是它的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXINPUT 100
int main()
{
    char input[MAXINPUT] = "";
    int length,i; 

    scanf ("%s", input);
    length = strlen (input);
    for (i=0;i<length; i++)
        if (!isdigit(input[i]))
        {
            printf ("Entered input is not a number\n");
            exit(1);
        }
    printf ("Given input is a number\n");
}

回答by paxdiablo

You can use a function like strtol()which will convert a character array to a long.

您可以使用类似的函数strtol()将字符数组转换为 long。

It has a parameter which is a way to detect the first character that didn't convert properly. If this is anything other than the end of the string, then you have a problem.

它有一个参数,用于检测未正确转换的第一个字符。如果这不是字符串的结尾,那么您就有问题了。

See the following program for an example:

有关示例,请参见以下程序:

#include <stdio.h>
#include <stdlib.h>

int main( int argc, char *argv[]) {
    int i;
    long val;
    char *next;

    // Process each argument given.

    for (i = 1; i < argc; i++) {
        // Get value with failure detection.

        val = strtol (argv[i], &next, 10);

        // Check for empty string and characters left after conversion.

        if ((next == argv[i]) || (*next != '
pax> testprog hello "" 42 12.2 77x

'hello' is not valid
'' is not valid
'42' gives 42
'12.2' is not valid
'77x' is not valid
')) { printf ("'%s' is not valid\n", argv[i]); } else { printf ("'%s' gives %ld\n", argv[i], val); } } return 0; }

Running this, you can see it in operation:

运行这个,你可以看到它在运行:

if (scanf("%d", &val_a_tester) == 1)) {
    ... // it's an integer
}

回答by Adrien.C

Using scanfis very easy, this is an example :

使用scanf非常简单,这是一个例子:

bool isNumeric(const char *str) 
{
    while(*str != '
int i;
int value;
int n;
char ch;

/* Skip i==0 because that will be the program name */
for (i=1; i<argc; i++) {
    n = sscanf(argv[i], "%d%c", &value, &ch);

    if (n != 1) {
        /* sscanf didn't find a number to convert, so it wasn't a number */
    }
    else {
        /* It was */
    }
}
') { if(*str < '0' || *str > '9') return false; str++; } return true; }

回答by Marius

A self-made solution:

一个自制的解决方案:

int integerCheck(){
char myInput[4];
fgets(myInput, sizeof(myInput), stdin);
    int counter = 0;
    int i;
    for (i=0; myInput[i]!= '
int main(void){
unsigned int numberOne;
unsigned int numberTwo;
numberOne = integerCheck();
numberTwo = integerCheck();
return numberOne*numberTwo;

}
'; i++){ if (isalpha(myInput[i]) != 0){ counter++; if(counter > 0){ printf("Input error: Please try again. \n "); return main(); } } } return atoi(myInput); }

Note that this solution should not be used in production-code, because it has severe limitations. But I like it for understanding C-Strings and ASCII.

请注意,此解决方案不应在生产代码中使用,因为它具有严重的局限性。但我喜欢它来理解C-Strings 和 ASCII

回答by Neil Townsend

Using fairly simple code:

使用相当简单的代码:

if (sscanf(command_level[2], "%f%c", &check_f, &check_c)!=1)
{
        is_num=false;
}
else
{
        is_num=true;
}   

if(sscanf(command_level[2],"%f",&check_f) != 1) 
{
    is_num=false;
}

回答by Jay

I was struggling with this for awhile, so I thought I'd just add my two cents:

我为此苦苦挣扎了一段时间,所以我想我只需要加两分钱:

1) Create a separate function to check if an fgets input consists entirely of numbers:

1) 创建一个单独的函数来检查 fgets 输入是否完全由数字组成:

#include <stdio.h>
#include <string.h>
int CONVERT_3(double* Amt){

    char number[100];

    // Input the Data
    printf("\nPlease enter the amount (integer only)...");
    fgets(number,sizeof(number),stdin);

    // Detection-Conversion begins
    int iters = strlen(number)-2;
    int val = 1;
    int pos;
    double Amount = 0;
    *Amt = 0;
    for(int i = 0 ; i <= iters ; i++ ){
        switch(i){
            case 0:
                if(number[i]=='+'){break;}
                if(number[i]=='-'){val = 2; break;}
                if(number[i]=='.'){val = val + 10; pos = 0; break;}
                if(number[i]=='0'){Amount = 0; break;}
                if(number[i]=='1'){Amount = 1; break;}
                if(number[i]=='2'){Amount = 2; break;}
                if(number[i]=='3'){Amount = 3; break;}
                if(number[i]=='4'){Amount = 4; break;}
                if(number[i]=='5'){Amount = 5; break;}
                if(number[i]=='6'){Amount = 6; break;}
                if(number[i]=='7'){Amount = 7; break;}
                if(number[i]=='8'){Amount = 8; break;}
                if(number[i]=='9'){Amount = 9; break;}
            default:
                switch(number[i]){
                    case '.':
                        val = val + 10;
                        pos = i;
                        break;
                    case '0':
                        Amount = (Amount)*10;
                        break;
                    case '1':
                        Amount = (Amount)*10 + 1;
                        break;
                    case '2':
                        Amount = (Amount)*10 + 2;
                        break;
                    case '3':
                        Amount = (Amount)*10 + 3;
                        break;
                    case '4':
                        Amount = (Amount)*10 + 4;
                        break;
                    case '5':
                        Amount = (Amount)*10 + 5;
                        break;
                    case '6':
                        Amount = (Amount)*10 + 6;
                        break;
                    case '7':
                        Amount = (Amount)*10 + 7;
                        break;
                    case '8':
                        Amount = (Amount)*10 + 8;
                        break;
                    case '9':
                        Amount = (Amount)*10 + 9;
                        break;
                    default:
                        val = 0;
                }
        }
        if( (!val) | (val>20) ){val = 0; break;}// val == 0
    }

    if(val==1){*Amt = Amount;}
    if(val==2){*Amt = 0 - Amount;}
    if(val==11){
        int exp = iters - pos;
        long den = 1;
        for( ; exp-- ; ){
            den = den*10;
        }
        *Amt = Amount/den;
    }
    if(val==12){
        int exp = iters - pos;
        long den = 1;
        for( ; exp-- ; ){
            den = den*10;
        }
        *Amt = 0 - (Amount/den);
    }

    return val;
}


int main(void) {
    double AM = 0;
    int c = CONVERT_3(&AM);
    printf("\n\n%d    %lf\n",c,AM);

    return(0);
}

The above starts a loop through every unit of an fgets input until the ending NULL value. If it comes across a letter or an operator, it adds "1" to the int "counter" which is initially set to 0. Once the counter becomes greater than 0, the nested if statement instructs the loop to print an error message & then restart the program. When the loops completes, if int 'counter' is still the value of 0, it returns the initially inputted integer to be used in the main function ...

以上开始循环遍历 fgets 输入的每个单元,直到结束 NULL 值。如果遇到字母或运算符,它会将“1”添加到初始设置为 0 的 int“计数器”。一旦计数器大于 0,嵌套的 if 语句会指示循环打印错误消息,然后重新启动程序。当循环完成时,如果 int 'counter' 仍然是 0 的值,它返回初始输入的整数以在主函数中使用......

2) the main function would be:

2)主要功能是:

##代码##

Assuming both integers are inputted correctly, the example provided will yield the result of int "numberOne" multiplied by int "numberTwo". The program will repeat for however long it takes to get two properly inputted integers.

假设两个整数都输入正确,提供的示例将产生 int "numberOne" 乘以 int "numberTwo" 的结果。该程序将重复获得两个正确输入的整数所需的时间。

回答by mwjay

##代码##

how about this?

这个怎么样?

回答by ytoamn

The sscanf() solution is better in terms of code lines. My answer here is a user-build function that does almost the same as sscanf(). Stores the converted number in a pointer and returns a value called "val". If val comes out as zero, then the input is in unsupported format, hence conversion failed. Hence, use the pointer value only when val is non-zero.

sscanf() 解决方案在代码行方面更好。我的答案是一个用户构建函数,它的作用几乎与 sscanf() 相同。将转换后的数字存储在一个指针中并返回一个名为“val”的值。如果 val 显示为零,则输入格式不受支持,因此转换失败。因此,仅当 val 非零时才使用指针值。

It works only if the input is in base-10 form.

仅当输入为 base-10 形式时才有效。

##代码##