Делай пока не зацикливаясь? - PullRequest
0 голосов
/ 01 мая 2019

Я новичок, который начал изучать C. Я хочу написать программу на C, которая помогает пользователям вводить номера.столько, сколько они хотят, и как только они закончат, программа показывает нет.положительных, отрицательных и нулей.Я пытаюсь сделать это с помощью do-while lopp.Он выполняется один раз, но не зацикливается.Я хочу знать, что я здесь делаю не так?

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

    do
    {
       printf("enter a no.\n");
       scanf("%d", &a);

       if (a>0)
       {
            p++;
       }
       else if (a==0)
       {
            z++;
       }
       else if(a<0)
       {
            n++;
       }

       printf("input more no.? y or n\n");
       scanf("%c\n", &c);
    } while (c=='y');

    printf("the total count of positive, negative and zeros are %d %d %d\n", p,n,z);

    return 0;
}

Ожидаемый результат:

введите номер.

4

больше нет ввода?y или n

y

введите номер.

3

введите больше номер?y или n

y

введите номер.

-1

введите больше номер?y или n

n

окончательное число положительных, отрицательных и нулей равно 2 1 0

Но фактический выходной сигнал равен:

введите номер.

4

введите больше номер?y или n

y

окончательное число положительных, отрицательных и нулей равно 1 0 0

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Ваша проблема - это комбинация двух отдельных проблем.

Первая состоит в том, что любые пробельные символы в строке формата scanf говорят scanf прочитать (и выбросить) любые последовательные белыепробел на входе.

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

Вторая проблема заключается в том, что для предыдущей операции ввода (scanf("%d", &a)) вы, вероятно, нажали Enter кнопка «отправить» вход в программу.Эта клавиша Enter будет помещена во входной буфер как новая строка (которая является символом пробела).Когда вы затем прочитаете своих персонажей в формате "%c", он будет читать эту новую строку.Вам нужно пропустить эту новую строку.

Обе проблемы решаются одинаково: попросите scanf прочитать (и выбросить) ведущий пробел.Это делается путем помещения пробела в начало строки формата, как в

scanf(" %c", &c);
//     ^
// Note space here instead

Также обратите внимание, что этот явный пропуск начального пробела необходим только для форматов "%c" и "%["все другие форматы делают это неявно.

0 голосов
/ 01 мая 2019

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

Чтобы обойти разделители (пробел / новая строка), просто добавьте пробел в формате перед %c, и вам не нужно указывать новую строку: scanf(" %c", &c);

После этого:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
enter a no.
4
input more no.? y or n
y
enter a no.
3
input more no.? y or n
y
enter a no.
-1
input more no.? y or n
n
the total count of positive, negative and zeros are 2 1 0
pi@raspberrypi:/tmp $ 
...