Мои неизвестные номера входного кода дублируют последний ввод - PullRequest
0 голосов
/ 28 марта 2020

Я работаю над одним из моих C заданий. У меня есть небольшая проблема с получением неизвестных чисел ввода. Это мой код:

    while ((a = getchar()) != EOF){
        ungetc(a,stdin);
        scanf(" %c %d %d %d",&a,&b,&c,&d);
        arr1[3*i] = b;
        arr1[3*i+1] = c;
        arr1[3*i+2] = d;
        i++;

(я сделал все объявления для этого)

Что я пытаюсь сделать здесь, так это то, что я беру входные данные и обрабатываю их в трех массивах. Мой ввод:

X 10 18 3

r -3 2 1

Y 0 -2 -1

После того, как я запишу их в терминал, Мне нужно нажать sh кнопки дважды Ctrl + D. А потом, когда я пытаюсь проверить arr1, это как {10, 18, 3, -3, 2, 1, 0, -2, -1, 0, -2, -1} Последний вход дублируется, и я не не знаю причину ..

!!! Главное, что я не знаю, сколько вкладов я приму. !!!

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

После каждого сканирования указатель файла остается на завершающей новой строке ввода. После сканирования последней строки ввода и присвоения значений b, c и d, getchar в то время как l oop читает последний символ новой строки. Тогда scanf не читает никаких значений, поэтому b, c и d не изменяются. Значения, которые были оставлены от предыдущего l oop, присваиваются массиву, i увеличивается, а затем getchar возвращает EOF и разрывы l oop. Всегда проверяйте значение, возвращаемое scanf. Другими словами, эта проблема испаряется, если вы используете обычную идиому

while(scanf(" %c%d%d%d",&a,&b,&c,&d) == 4) { ...

Кроме того, в этом случае ошибка была бы замечена легче, если бы вы не копировали данные без необходимости во временные переменные. B , c, и d, но только что сделал:

while( scanf(" %c%d%d%d", &a, arr + 3*i, arr + 3*i +1, arr + 3*i + 2) == 4 

, что было бы написано более четко как:

int *base = arr;
while( scanf(" %c%d%d%d", &a, base, base + 1, base + 2) == 4 ) {
    base += 3; ...

Обратите внимание, что во всех них a действительно должен быть объявлен как символ, но для присвоения a из getchar необходимо, чтобы a было int, и это должно быть подсказкой, что попытка использовать getchar/ungetc является ошибкой.

Подводя итог, можно сказать, что на всех входных строках, кроме первой, getchar читает '\ n', ungetc выталкивает эту новую строку обратно в буфер, а затем scanf пропускает ее из-за начальных пробелов в строка формата.

0 голосов
/ 29 марта 2020

относительно:

while ((a = getchar()) != EOF){
    ungetc(a,stdin);
    scanf(" %c %d %d %d",&a,&b,&c,&d);
    arr1[3*i] = b;
    arr1[3*i+1] = c;
    arr1[3*i+2] = d;
    i++;

Предложить использование возвращаемого значения из scanf(), аналогично:

int i = 0;
while ( scanf(" %c %d %d %d",&a,&b,&c,&d) == 4 )
{
    arr1[3*i] = b;
    arr1[3*i+1] = c;
    arr1[3*i+2] = d;
    i++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...