getchar () не работает в c

getchar () не работает в приведенной ниже программе, может ли кто-нибудь помочь мне решить эту проблему. Я попробовал функцию scanf () вместо getchar (), но она тоже не работает.

Я не могу понять основную причину проблемы, кто-нибудь может мне помочь.

#include<stdio.h>
int main()
{
        int x, n=0, p=0,z=0,i=0;
        char ch;

        do
        {
                printf("\nEnter a number : ");
                scanf("%d",&x);

                if (x<0)
                        n++;
                else if (x>0)
                        p++;
                else
                        z++;

                printf("\nAny more number want to enter : Y , N ? ");
                ch = getchar();

                i++;

        }while(ch=='y'||ch=='Y');
        printf("\nTotal numbers entered : %d\n",i);
        printf("Total Negative Number : %d\n",n);
        printf("Total Positive number : %d\n",p);
        printf("Total Zero            : %d\n",z);
        return 0 ;
}

Код был скопирован из книги «Яшвант Канеткар».


person Piyush Zalani    schedule 22.06.2015    source источник
comment
Пожалуйста, выбросьте все книги Канеткара в мусорную корзину, где они принадлежат - есть хороший список качественных книг на C прямо здесь, в StackOverflow - выберите одну или две из них, чтобы поучиться.   -  person Paul R    schedule 18.12.2015
comment
@PaulR Вы ошибаетесь !!!!! ты хоть эту книгу читал !! Я изучаю c из книги Яшванта Канеткара, и я не думаю, что это относится к мусору !! Я его отличная книга.   -  person    schedule 20.06.2017
comment
@SMITPATIL: к сожалению, книги Kanetkar сильно устарели (более 20 лет) и полны ошибок и неверной информации. По какой-то причине большинство индийских колледжей, похоже, используют их (и столь же устаревший Turbo C), поэтому индийские выпускники должны отучиться от множества плохих практик и заново правильно изучать C после колледжа. Попробуйте найти более точную и современную книгу из списка, на который я ссылался выше, если вы серьезно относитесь к тому, чтобы научиться быть хорошим программистом на C.   -  person Paul R    schedule 20.06.2017
comment
@PaulR Вы правы насчет турбо. Я ненавижу это !! Я использую vim + gcc, и учителя злятся на меня! Я знаю, что книга kanerkars не так хороша, как книги вашего списка, но это не так уж плохо, и karnerkar также не предлагает использовать turbo c. Фактически они сказали использовать netbeans в своей книге. В любом случае я буду использовать ваш список для обучения c.   -  person    schedule 21.06.2017


Ответы (5)


Это потому, что scanf() оставил конечную новую строку во вводе.

Предлагаю заменить это:

ch = getchar();

С участием:

scanf(" %c", &ch);

Обратите внимание на начальный пробел в строке формата. Необходимо заставить scanf() игнорировать каждый пробельный символ до тех пор, пока не будет прочитан непробельный символ. Это обычно более надежно, чем использование одного символа в предыдущем scanf(), поскольку игнорирует любое количество пробелов.

person Filipe Gonçalves    schedule 22.06.2015
comment
@PiyushZalani Вы пробовали с ведущим пробелом в строке формата? - person Filipe Gonçalves; 22.06.2015
comment
Ух ты! Мне нравится решение, но не могли бы вы объяснить мне больше, почему пространство имеет такое значение? - person Piyush Zalani; 22.06.2015
comment
@PiyushZalani Пробел в строке формата означает использование и игнорирование каждого символа пробела. - person Filipe Gonçalves; 22.06.2015

Когда пользователь вводит x и нажимает клавишу ввода, символ новой строки остается во входном потоке после операции scanf(). Затем, когда вы пытаетесь прочитать символ с помощью getchar(), он читает тот же символ новой строки. Короче ch получает значение символа новой строки . Вы можете использовать цикл, чтобы игнорировать символ новой строки.

ch=getchar();
while(ch=='\n')
ch=getchar();
person Gaurav Sehgal    schedule 22.06.2015
comment
Я не думаю, что это хорошее решение, есть ли другое решение. - person Piyush Zalani; 22.06.2015
comment
Вы можете увидеть другие ответы, которые используют спецификатор формата для игнорирования символа новой строки. И почему вы не думаете, что это хорошее решение? - person Gaurav Sehgal; 22.06.2015
comment
Он будет зацикливаться, пока не избавится от символа новой строки. И зацикливание - неплохая практика программирования. - person Gaurav Sehgal; 22.06.2015
comment
ohk Спасибо за вашу помощь. - person Piyush Zalani; 22.06.2015

Я думаю, что в вашем коде проблема связана с оставшимся \n из

 scanf("%d",&x);

Вы можете изменить этот оператор сканирования на

scanf("%d%*c",&x);    

чтобы съесть newline. Затем следующий getchar() будет ждать ввода пользователя, как и ожидалось.

Тем не менее, тип возврата getchar() - int. Дополнительную информацию можно найти на странице руководства. Таким образом, возвращаемое значение может не всегда вписываться в char. Предложите изменить ch на int с char.

Наконец, рекомендуемая подпись main() - int main(void).

person Sourav Ghosh    schedule 22.06.2015
comment
Это не поможет, если они введут число, а затем пробел и нажмите Enter. - person M.M; 23.06.2015

Замена ch = getchar(); на scanf(" %c", &ch); отлично сработала!

Но использование fflush(stdin) после scanf не помогло.

person calvesmit    schedule 30.06.2019

Когда вы используете scanf getchar и т. Д., Все, что вы ввели, сохраняется как строка (последовательность символов) в stdin (стандартный ввод), тогда программа использует то, что необходимо, и оставляет остаток в stdin.

Например: 456 - это {'4','5','6','\0'}, 4tf - это {'4','t','f','\0'} с scanf("%d",&x);, вы просите программу прочитать целое число, в первом случае будет читать 456 и оставить {'\0'} в stdin, а во втором - 4 и оставить {''t','f',\0'}.

После scanf вы должны использовать fflush(stdin), чтобы очистить входной поток.

person Nikolas Manes    schedule 21.03.2018