C确定用户输入是否为整数

C确定用户输入是否为整数,c,validation,input,C,Validation,Input,嗨,我需要提示用户输入一些信息,然后进行验证。只有当输入为正整数且不大于23时,才必须验证输入。我遇到的唯一问题是当用户输入一个非数字输入,如“hello”。下面的代码没有成功检测到任何输入是非数字的,尽管我尝试了许多方法来实现这一点,但它们似乎都不起作用。下面是我通过将输入作为字符串,然后将其转换为整数得到的最接近的结果,但是它仍然不起作用。任何帮助都将不胜感激 #include <stdio.h> #include <stdlib.h> #include <ct

嗨,我需要提示用户输入一些信息,然后进行验证。只有当输入为正整数且不大于23时,才必须验证输入。我遇到的唯一问题是当用户输入一个非数字输入,如“hello”。下面的代码没有成功检测到任何输入是非数字的,尽管我尝试了许多方法来实现这一点,但它们似乎都不起作用。下面是我通过将输入作为字符串,然后将其转换为整数得到的最接近的结果,但是它仍然不起作用。任何帮助都将不胜感激

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


int main(void) {
    int height;
    char input[50];
    int cont = 0;
    while (cont == 0) {
        printf("Please provide a non-negative integer no greater than 23.\n");
        scanf("%s", &input);
        height = atoi(input);
        if (height <= 23 && height >= 0) {
            cont = 1;
        } else {
            //do nothing
        }
    }
    printf("Valid Input.\n");
    return 0;
    }
#包括
#包括
#包括
内部主(空){
内部高度;
字符输入[50];
int cont=0;
而(cont==0){
printf(“请提供一个不大于23的非负整数。\n”);
scanf(“%s”,&input);
高度=atoi(输入);
如果(高度=0){
cont=1;
}否则{
//无所事事
}
}
printf(“有效输入。\n”);
返回0;
}
函数没有返回错误指示器的规定。相反,您可以使用
strtol()
函数:

char *end;
height = strtol(input, &end, 10);
if (end == input) {
    // no digits were entered
    puts("Invalid input.");
    continue;
}
atoi()
函数没有返回错误指示器的规定。相反,您可以使用
strtol()
函数:

char *end;
height = strtol(input, &end, 10);
if (end == input) {
    // no digits were entered
    puts("Invalid input.");
    continue;
}
#包括
内部主(空){
内部高度;
而(1){
printf(“请提供一个不大于23的非负整数。\n”);
//如果(2==scanf(“%d%c”、&height,&nl)&&nl='\n'&&0
,包括
内部主(空){
内部高度;
而(1){
printf(“请提供一个不大于23的非负整数。\n”);

//如果(2=SCANF(“%D %C”,和高度,和NL)& & NL=='\n′& & 0<P>,我假设您必须考虑整个输入,而不是只考虑某些部分,如“12JJJ”和“23 H”无效。 在我看来,因为23只有2个字符,所以检查字符串的长度和单个字符没有什么坏处

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

bool ValidateInput (char * input, int &output)
{
    if (strlen(input) > 2)
        return false;

    for (int index = 0; index < strlen (input); index++)
    {
        if ((input[index] < '0') || input[index] > '9')
            return false;
    }

    output = atoi(input);

    return true;

}


int main(void) {
    int height;
    char input[50];
    int cont = 0;
    while (cont == 0) {
        printf("Please provide a non-negative integer no greater than 23.\n");
        scanf("%s", input);

        if (ValidateInput (input, height))
            break;
    }
    printf("Valid Input.\n");
    return 0;
    }
#包括
#包括
#包括
#包括
布尔验证输入(字符*输入、输入和输出)
{
如果(strlen(输入)>2)
返回false;
对于(int index=0;index'9')
返回false;
}
输出=atoi(输入);
返回true;
}
内部主(空){
内部高度;
字符输入[50];
int cont=0;
而(cont==0){
printf(“请提供一个不大于23的非负整数。\n”);
扫描频率(“%s”,输入);
if(验证输入(输入,高度))
打破
}
printf(“有效输入。\n”);
返回0;
}

我希望这有帮助。

< P>我假设你必须把整个输入考虑进去,而不是只考虑某些部分,如“12JJJ”和“23小时”无效。

在我看来,因为23只有2个字符,所以检查字符串的长度和单个字符没有什么坏处

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

bool ValidateInput (char * input, int &output)
{
    if (strlen(input) > 2)
        return false;

    for (int index = 0; index < strlen (input); index++)
    {
        if ((input[index] < '0') || input[index] > '9')
            return false;
    }

    output = atoi(input);

    return true;

}


int main(void) {
    int height;
    char input[50];
    int cont = 0;
    while (cont == 0) {
        printf("Please provide a non-negative integer no greater than 23.\n");
        scanf("%s", input);

        if (ValidateInput (input, height))
            break;
    }
    printf("Valid Input.\n");
    return 0;
    }
#包括
#包括
#包括
#包括
布尔验证输入(字符*输入、输入和输出)
{
如果(strlen(输入)>2)
返回false;
对于(int index=0;index'9')
返回false;
}
输出=atoi(输入);
返回true;
}
内部主(空){
内部高度;
字符输入[50];
int cont=0;
而(cont==0){
printf(“请提供一个不大于23的非负整数。\n”);
扫描频率(“%s”,输入);
if(验证输入(输入,高度))
打破
}
printf(“有效输入。\n”);
返回0;
}

我希望这有帮助。

scanf(“%s”和&input);
是不正确的。提示:
input
的类型是什么?对于
scanf
,不要使用
%s
,没有字段宽度(并且
s
说明符采用
char*
参数,您传递了
char(*)[50]/code>参数):
scanf
scanf(“%s”和&input);
不正确。提示:
input
的类型是什么?对于
scanf
,不要使用
%s
,没有字段宽度(并且
s
说明符采用
char*
参数,您传递了
char(*)[50]
参数):
scanf 49s”,input)
。当然,您可以使用
end
使以数字开头、后跟非空终止符或换行符的字符串无效,而不是使用
end==input
接受它们。这是一个偏好问题,但如果您允许“12yes”,则值得记录“yes”的情况\n..也就是说,通过测试
if(*end!='\0')
相反。我认为这是更好的建议。当然,您可以使用
end
使以数字开头、后跟字符而不是空终止符或换行符的字符串无效,而不是使用
end==input
来接受它们。这是一个偏好问题,但值得记录发生了什么如果您允许“12yes\n”,则为“yes”…也就是说,通过测试
if(*end!='\0')
来代替。我认为这是更好的建议。