Ошибка Scanf в C при чтении символа - PullRequest
0 голосов
/ 09 августа 2010
#include <stdio.h>

int main()
{
    char TurHare; 

    while(1)
    {
        scanf("%c",TurHare);
     printf("\nCharacter :%c", TurHare);
 }
    return 0;
}

Когда я компилирую, а затем запускаю программу, вывод выглядит так:

w
Character : w
Character : 

где w - ввод с консоли.

Это должно выглядеть как:

w
Character : w

Как это сделать?

Ответы [ 4 ]

2 голосов
/ 09 августа 2010

Вы пропустили &.

Повторите с

int main()
 {
char TurHare;   

    while(1)
    {
    scanf("%c",&TurHare);
    printf("\nCharacter :%c", TurHare);
    }

return 0;
} 

Я рекомендую использовать getch, getche, getchar для символов, scanf приведет к некоторой проблеме с буферизацией

1 голос
/ 09 августа 2010

Есть проблема с буферизацией в scanf ("% c").Многие люди используют fflush (stdin) для решения, но это не ANSI.

void fflushstdin()
{
    int c;
    while( (c=getchar())=='\n' );
    if( c!=EOF )
        ungetc(c,stdin);
}

main()
{
    int TurHare;
    while( fflushstdin(), !feof(stdin)&&1==scanf("%c",&TurHare) )
    {
        printf("\nCharacter :%c", TurHare);
    }
    return 0;
}

Разорвать цикл с помощью ^ Z в Windows и ^ D в Unix / Linux.

1 голос
/ 09 августа 2010

Хорошо, это из-за ключа возврата, который вы вводите после ввода w. поэтому, как только он читает w, а в другой раз читает символ конца строки.

0 голосов
/ 09 августа 2010

Ваша программа делает то, что вам говорят, она выводит введенные вами символы.

Теперь, когда вы вводите w, посмотрите, что вы делаете.Вы нажимаете 2 клавиши.клавиша w и Enter.Это вывод, который вы получаете, w и перевод строки (с клавиши ввода).Если вы не хотите этого, сделайте, например,

char TurHare; 

while(1)
{
    if(scanf("%c",&TurHare) != 1) { //always check for errors
       break; //or some other error handling
    }

    if(c != '\n') { //or perhaps if(!isspace(c)) from <ctype.h>
      printf("\nCharacter :%c", TurHare);
      fflush(stdout);
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...