Я не понимаю, почему я не могу получить три входа в с - PullRequest
2 голосов
/ 19 октября 2011

Моя подруга пытается выучить c (самостоятельно, с книгой), и иногда она просит помощи.

Она просто показала мне то, на что я не могу ответить;Мне стыдно, но я изучал C в колледже, а затем перешел на php.Я действительно застрял, поэтому я хотел бы знать, почему мы не можем получить три входа.Вот частичный код:

#include <stdio.h>

int main()
{
    int num1;
    int num2;
    char x;

    printf("Enter a number:\n");
    scanf("%d\n",&num1);
    printf("Enter another number:\n");
    scanf("%d\n",&num2);
    printf("Choose an operation sign:\n");
    scanf("%c\n",&x);

...

Таким образом, он запрашивает первый ввод два раза, например:

Enter a number:
1
2
Enter another number:
3
Choose an operation sign:
-

Если я удаляю \n, он пропускает последний scanf.

Можете ли вы помочь мне понять, почему?

Ответы [ 3 ]

4 голосов
/ 19 октября 2011

Читайте здесь: scanf () оставляет новый символ строки в буфере?

Решение:

int main()
{
    int num1;
    int num2;
    char x;

    printf("Enter a number:\n");
    scanf("%d",&num1);
    printf("Enter another number:\n");
    scanf("%d",&num2);
    printf("Choose an operation sign:\n");
    scanf("\n%c",&x); /* See the \n <---------------- */
}

Альтернатива:

char buf[2]; /* We need 2 characters for the null */
scanf("%1s", buf); /* We ask max 1 character (plus null given by scanf) */
char x = buf[0]; /* We take the first character */

В качестве небольшого примечания, благодаря тому, как работает scanf, с обоими решениями вы можете вставить непосредственно в первый «ввод» все данные, и различные scanf примут свое участие.Таким образом, вы можете вставить 123 234 +, и он будет правильно разделен на три переменные.

1 голос
/ 19 октября 2011

Да, scanf не удаляет символ новой строки, и вы не можете сбросить stdin, так как насчет этого:

int num1;
char nleater;
printf("Enter a number:\n");
scanf("%d%c", &num1, &nleater);

или действительно так:

printf("Enter number sign number: ");
scanf("%d %c %d",&num1,&x,&num2);
printf("%d %c %d", num1, x, num2);
0 голосов
/ 19 октября 2011

Вы также можете попробовать использовать fflush, но это зависит от реализации библиотеки (stdio).Ссылка C для этого может быть найдена здесь .

Я чуть позже протестирую это, обновлю свой пост и скажу, работает ли он.

...