1

我正在用 C 语言编写一个程序,假设向用户询问一个数字。

数字必须大于零,并且数字前后不能有字母。(即:400有效但abc400abc不是abc400)。我可以让我的程序使除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');
}
4

8 回答 8

6

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

于 2012-07-05T02:14:27.170 回答
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,但空字符串不是有效数字。

于 2012-07-05T06:40:17.300 回答
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;
}

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

于 2012-07-05T07:24:10.687 回答
0

使用 . 将输入读取为一行fgets

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

如果不是,则无效。如果是,请使用sscanf将行转换为 int。

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

于 2012-07-05T02:14:33.577 回答
0

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

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

于 2012-07-05T02:16:21.710 回答
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");
}
于 2012-07-05T16:49:08.183 回答
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;
}
于 2012-07-05T10:20:52.607 回答
0

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

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

char delim;
if(scanf("%d%c", &c, &delim) == 2 && !isspace(delim))
  // the input is invalid
于 2012-07-05T07:02:21.140 回答