Получение и печать символов в C? - PullRequest
1 голос
/ 10 сентября 2009

Как мне получить и распечатать символ от пользователя? Это хочу сделать это ...

#include <stdio.h> 
int main() {

    float number1;
    char mychar = ' ';

    printf("Number?\n");
    scanf("%f", &number1);

    printf("Character?\n");
    scanf("%c", &mychar);

    printf("You typed number: %f\n", number1);
    printf("You typed the char: %c\n", mychar);
}

Ответы [ 4 ]

3 голосов
/ 10 сентября 2009

Проблема, которую вы видите, в том, что она действительно читает персонажа, но это не тот персонаж, которого вы ожидаете. scanf делает форматированный ввод. Когда вы звоните в первый раз, вы говорите, что ожидаете число. Но вы действительно вводите больше, чем просто число:

Number?
1234.5678<enter>

Когда вы нажимаете клавишу ввода, он фактически вставляет символ в ваш поток ввода. Как вы, возможно, знаете, мы используем \ n для представления новой строки, символа, который вы получаете, когда нажимаете ввод. Таким образом, ваш входной поток на самом деле выглядит как "1234.5678 \ n".

Так что scanf делает свое дело и читает 1234.5678, а затем видит '\ n'. Там написано «о, это не часть номера, поэтому я остановлюсь». Что ж, ваш ввод по-прежнему содержит '\ n'. В следующий раз, когда вы вызовете scanf, вы скажете ему прочитать символ. Пользователь вводит все, что хочет, но это идет после '\ n' из предыдущего сканирования. Поэтому scanf пытается сопоставить входной поток с символом и говорит: «Хорошо, первое, что есть в этом входном потоке, это символ, и это '\ n', поэтому я его верну». Материал, введенный пользователем, все еще находится в потоке ввода.

Таким образом, простой способ избавиться от него - создать цикл, который очищает все оставшиеся символы из входного потока до тех пор, пока не найдет \ n.

printf("Number?\n");
scanf("%f", &number1);
while( getchar() != '\n');

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

Также обратите внимание, что scanf имеет возвращаемое значение, которое вы должны проверить после его вызова. Читайте о scanf, чтобы увидеть, что он возвращает.

2 голосов
/ 10 сентября 2009

Как прокомментировал, ваш вопрос уже содержит ответ. Но все равно:

Если вы хотите сделать то же самое в c ++, вы можете использовать потоки:

int mynumber;
char mychar;
cout << "Number?" << endl;
cin >> mynumber;
cout << "Character?" << endl;
cin >> mychar;
cout << "you typed number " << mynumber << " and char " << mychar << endl;

Конечно, ваша реализация C будет работать так же хорошо в C ++.

(Если вы разрабатываете более серьезное приложение, я бы рекомендовал использовать что-то более сложное, чем просто cin или scanf)

2 голосов
/ 10 сентября 2009

В C вам не нужно использовать scanf для получения отдельных символов. Вы можете использовать функцию getchar ():

printf("Would you like a donut? [Y/N] ");
answer = getchar();

switch(answer) {
    case 'y':
    case 'Y':
        printf("Mmmm... donuts!");
        break;
    case 'n':
    case 'N':
        printf("Eugh... donuts?");
        break;
    default:
        printf("You should never ignore code offering donuts.");
        break;
}  
0 голосов
/ 10 сентября 2009

lookup gets (), getc () и т. Д. -

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...