входной буфер в getchar () и scanf

Извините, потому что я не могу придумать лучшего названия. У меня проблема с вводом. Вот мой тестовый код, который получает ввод в массив строк, а затем снова распечатывает его на экране, довольно просто

Первый тестовый код работает нормально, как и ожидалось

#include <stdio.h>
int main()
{
    int i, index;
    char d, c[20];
    scanf("%d", index);
    for(i=0; i<index; i++){
        *(c+i) = getchar();
        if (*(c+i)=='$')
            break;
    }
    printf("the string is %s", c);
    return 0;
}

во втором тестовом коде я использовал указатель, но вместо него c [i], и программа не запустилась. Это довольно странно, поскольку * (c + i) и c [i] эквивалентны

я изменил

        *(c+i) = getchar(); // (0)
        if (*(c+i)=='$')

to

        c[i] = getchar(); // (1)
        if (c[i]=='$')

or

        c[i] = getchar(); // (2)
        if (*(c+i)=='$')

or

        *(c+1) = getchar(); // (3)
        if (c[i]=='$')

(3) работают нормально, проблем не возникло, но в (1) и (2) вывод - это только первый символ ввода, независимо от того, как долго вводится строка

Пример: введите asdads $

вывод: a

Итак, проблема заключается в коде getchar (), есть разница между использованием указателя и прямого элемента массива для получения ввода, но я не знаю, в чем проблема.

Я назову эту проблему A, потому что я столкнулся с несколькими проблемами, когда пробовал код другого типа с помощью scanf и getchar.

Теперь я меняю getchar () в каждом случае на scanf

(0) (1) (2) (3): возникла проблема A. Теперь ни один из них не работает нормально со scanf. С getchar работают как минимум (0) и (3).

Теперь вместо ввода данных непосредственно в c, я ввожу данные в d и передаю это значение d в c [i]

Используя d = getchar (), проблема A возникает во всех 4 случаях. scanf дает тот же результат

Что странно, когда я нажимаю Enter, программа автоматически прерывается и выводится на экран

Это всего лишь тест, но вот текущая проблема, с которой я сталкиваюсь.

    int z;
    printf("continue? [1=yes/0=no] ");
    scanf("%d", &z);
    switch (z){
        case 1: printf("next info is: ");
                scanf("%d", &x);
                break;
        case 0: *end = '\0';
                break;
    }

Это работает нормально, использование scanf с% d в порядке, он ждет, пока я нажму 1 или 0, чтобы продолжить процесс. Однако проблема возникла с этими двумя кодами, которые, как ожидается, будут работать одинаково. Они не ждут, чтобы я ударил y / n, а идут прямо до конца

    char z;
    printf("continue? [y/n] ");
    z=getchar(); // using getchar
    if(z=='y'){
                printf("next info is: ");
                scanf("%d", &x);

    }
    else{

        *end = '\0';
    }

а также

    char z;
    printf("continue? [y/n] ");
    z=getchar();
    switch(z=='y'){
        case 1: printf("next info is: ");
                scanf("%d", &x);
                break;
        case 0: *end = '\0';
                break;
    }

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


person aukxn    schedule 20.03.2015    source источник
comment
scanf("%d", index); неверно.   -  person Sourav Ghosh    schedule 20.03.2015
comment
scanf("%d", ...); не использует '\n', введенный после целого числа. Он все еще находится в stdin ожидании следующей операции ввода.   -  person chux - Reinstate Monica    schedule 20.03.2015


Ответы (2)


Да! в первую очередь нужно использовать scanf("%d",&index);, вы использовали его неправильно. Вы должны передать адрес переменной.

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

scanf("%d", index);
getchar();
    for(i=0; i<index; i++){
        *(c+i) = getchar();
        if (*(c+i)=='$')
            break;
    }

Теперь во втором случае (где вы используете int в качестве входных данных) он работает как '\ n' (или любой пробел), если символ игнорируется scanf (специфицированный формат - «% d», а не «% c»).

person user2736738    schedule 20.03.2015
comment
Спасибо за объяснение, похоже, что использование адреса решает 1-й случай, но 2-й случай, я использую getchar, но не scanf, и не знаю, как программа даже не дождалась, пока я введу символ. - person aukxn; 20.03.2015
comment
@aukxn .: Я уже упоминал, что getchar () принимает символ из стандартного ввода. Поскольку есть '\ n', он берет его и очищает буфер. Если ответ был удовлетворительным, примите / проголосуйте за него. (Именно это делает публикацию полезной для будущих пользователей). Проверьте это для получения дополнительной информации stackoverflow.com/tour - person user2736738; 20.03.2015
comment
Приносим извинения за недостаточную репутацию, чтобы проголосовать за вас. Итак, если во втором случае я использую сканирование, он проигнорирует любой символ, например \ n \ t \ 0 и т. Д., И программа будет работать, как ожидалось? - person aukxn; 20.03.2015
comment
@aukxn .: Да! проверь это сам - person user2736738; 20.03.2015

#include <stdio.h>
int main()
{
    int i, index;
    char d, c[20];
    scanf("%d",index);//*2
    for(i=0; i<index; i++){
    c[i] = getchar(); // (1)
    if (c[i]=='$')
        break;
}
printf("%d",index); //*1
printf("the string is %s", c);
return 0;
}

Если вы напечатаете нет. индекса (* 1) вы узнаете, когда в некоторой ситуации index = 1. Единственное место в строке предназначено для NULL. Итак, в вашей программе есть некоторые проблемы, и это не проблема (1) (2) ( 3).

Вы можете изменить программу:

*2 to scanf("%d",&index);

После этого вы успешно выполните (1) (2) (3).

person whalesf    schedule 20.03.2015