如何将用户输入限制为预定的整数

时间:2019-03-23 13:31:51

标签: c scanf

我正在使用scanf(带有循环)将整数分配给数组。我希望用户仅在终端输入8个整数(它将在一行上)。如果他们输入9个数字,我希望程序打印一条错误消息。

我尝试将if语句与scanf组合。

int main(){
int input[8] = {0};
int countM = 0;

while(countM < 9){
    if(scanf("%d", &input[countM]) < 8){
        countM++;
    } else{
        printf("Invalid input");
        exit(0);
    }
}
return(0);
}

它没有检测到第9个输入。我希望它输出“无效输入”。

2 个答案:

答案 0 :(得分:3)

您说输入将全部放在一行上。因此,在字符串中输入一行并检出。这会尝试扫描第9个输入。

int input[8] = { 0 };
char dummy[8];
char buff[200];
if(fgets(buff, sizeof buff, stdin) == NULL) {
    exit(1);                // or other action
}
int res = sscanf(buff, "%d%d%d%d%d%d%d%d%7s", &input[0], /* etc */, &input[7], dummy);
if(res != 8) {
    exit(1);                // incorrect inputs
}

这是一个完全有效的示例,它是对@AnttiHaapala注释的改进,并减少为接受两个数字而不是8。

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

int main(void) {
    int input[2] = { 0 };
    char dummy;
    char buff[200];
    if(fgets(buff, sizeof buff, stdin) == NULL) {
        exit(1);                // or other action
    }
    int res = sscanf(buff, "%d%d %c", &input[0], &input[1], &dummy);
    if(res != 2) {
        exit(1);                // incorrect inputs
    }
    puts("Good");
}

答案 1 :(得分:1)

让我们看看您的代码。

int input[8] = {0};                     // (1)
int countM = 0;
while(countM < 9){
    if(scanf("%d", &input[countM]) < 8) // (2)
    ...
}

在(1)中,定义一个长度为8的数组。在(2)中,您有一个while循环,该循环遍历9个整数(从0到8)。在循环的最后一次运行中,您有一个等价

scanf("%d", &input[8] < 8)

超出数组范围。范围之外,有龙。此外,< 8比较并不能满足您的要求。

如果您打算检查边界,则应在访问或分配数组的那一部分之前这样做

例如:

while(countM < 9){
    if (countM > 7)
    {
        // do whatever you want when this should happen
        break;
    }
    // rest of code
}

但是如您所见,这有点奇怪。您知道您将触发该代码。

您可以通过类似的方式做得更好

int val;
int countM = 0;
while (scanf("%d", &val) == 1)
{
    if (countM > 7)
    {
        printf("Whoops");
        // whatever you want
        exit(1);
    }
    // rest of code
}