如何使c中的输入无效

时间:2012-07-05 02:08:17

标签: c

我正在用C编写程序,假设要求用户输入一个数字。

数字必须大于零,并且在数字之前或之后不能包含字母。 (即:400有效但abc400abcabc400不是有效的。我可以使我的程序使除400abc之外的所有内容无效。如果输入开始有效然后变为无效,我将如何使输入无效? (我大约2个月进入c级介绍所以我的知识非常有限。)

    #include<stdio.h>

int check(void);
void clear_input(void);

main()
{
    int num;
    printf("Please enter a number: ");

    num = check();
    printf("In Main %d\n", num);

}

int check(void){

    int c;

    scanf("%d", &c);
    while (c < 0){
        clear_input();
        printf("Invalid, please enter an integer: ");
        scanf("%d", &c);
    }

    return c;
}

void clear_input(void){
    char junk;
    do{
        scanf("%c", &junk);
    }while (junk != '\n');
}

8 个答案:

答案 0 :(得分:6)

您还可以检查从用户输入扫描的每个字符的ascii值是否应该在48-57范围内,它只是整数值。

答案 1 :(得分:1)

strtol可以用来做,但需要额外的工作。

运行此代码后:

char *endptr;
int n = strtol(num_text, &endptr, 10);

n将包含该号码。但你还是要检查一下:
1. *endptr=='\0' - 这意味着strtol并没有停在中间。在400abc中,endptr将指向abc。您可能希望允许尾随空格(在这种情况下,请检查endptr是否指向全空格字符串。
2. num_text不是空的。在这种情况下,strtol将返回0,但空字符串不是有效数字。

答案 2 :(得分:0)

使用fgets将输入作为一行阅读。

检查所有字符是否都是数字。

如果没有,则无效。如果是,请使用sscanf将行放入int。

检查int是否在范围内;你已经完成了。

答案 3 :(得分:0)

带有%d的Scanf会将“400abc”视为400,所有尾随字符都将被忽略,因此无需担心。

如果您肯定想将“400abc”视为无效输入,那么也许您不应该在scanf中使用%d,而是使用%s?

答案 4 :(得分:0)

一种方法是将整行读作一个字符串,并自行检查它是否包含任何非数字。

另一种方法是读取整数,然后使用fgetc()查看输入,以查看检测到的输入后的下一个字符是否有效。或者您甚至可以使用相同的scanf():

char delim;
if(scanf("%d%c", &c, &delim) == 2 && !isspace(delim))
  // the input is invalid

答案 5 :(得分:0)

你可以读取一个字符数组中的数字并通过检查所有字符是否位于ascii范围48到57('0'到'9')中来验证它。如果你没有。是有效的,否则你可以放心地将其视为无效输入。这是演示:

#include<stdio.h>
#include<string.h>
int conv( char * word )
{
    int ans=0;
    int res=0;
    for(int i=0;i<strlen(word);i++)
        if(word[i]>='0' && word[i]<='9')
            ans=(ans*10) + (word[i] - '0');
        else
            res=-999;
    if(res==-999)
        return res;
    else
        return ans;
}
int main()
{
    char a[10];
    gets(a);
    int b=conv(a);
    if(b==-999)
        printf("Invalid Entry.\n");
    else
        printf("Success.No is %d.\n",b);
    return 0;
}

您也可以通过检查单词数组中的第一个字符为“ - ”并相应地调整符号来调整负数。

答案 6 :(得分:0)

以下是您的检查功能已重写以解决您的问题,请尝试以下操作:

int check(void){

    int n;
    char c;

    while (EOF==scanf("%d%c", &n,&c) || n < 0 || !isspace(c)){
        clear_input();
        printf("Invalid, please enter an integer: ");
    }

    return n;
}

答案 7 :(得分:0)

这是C99,所以使用-std = c99

进行编译
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>

bool getNum(int *n) {
    char c, s[10];
    if (!scanf("%9s", s))
        return false;
    for (int i=0; c=s[i]; i++)
        if (!isdigit(c))
    return false; 
    *n = atoi(s);
    return true;
}

int main() {
    int n;
    if (getNum(&n))
        printf("you entered %d\n", n);
    else
        printf("you did not enter a number\n");
}