Как ограничить ввод пользователя заданным числом целых чисел - PullRequest
0 голосов
/ 23 марта 2019

Я использую 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 ]

3 голосов
/ 23 марта 2019

Вы говорите, что вход будет все в одной строке.Поэтому введите одну строку в строку и проверьте ее.При попытке выполнить поиск 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 голос
/ 23 марта 2019

Давайте посмотрим на ваш код.

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
}
...