2013-03-04 2 views
3

, имеющие проблем с Scanf характером ... при запуске программы не препятствует мне ввести символ программу, когда я вхожу целое число печатает Printf и перейти к последним еще ...C программирование: символ в Scanf

#include <stdio.h> 
#include <stdlib.h> 

#define EG 0.23 
#define AG 0.70 
#define TG 0.15 

main() { 
    int posothta; 
    char eidos; 
    float poso; 

    printf("Dwse posothta grammatosimwn: "); 
    scanf("%d",&posothta); 
    printf("Dwse to eidos grammatoshmou: "); 
    scanf("%c",&eidos); 

    if(eidos=='E' || eidos=='e'){ 
     poso=posothta*EG; 
     printf("To poso pou plirwnoume einai: %f",poso); 
    }else if(eidos=='A' || eidos=='a'){ 
     poso=posothta*AG; 
     printf("To poso pou plirwnoume einai: %f",poso); 
    }else if(eidos=='T' || eidos=='t'){ 
     poso=posothta*TG; 
     printf("To poso pou plirwnoume einai: %f",poso); 
    }else{ 
     printf("Kapou exei gine kapoio la9os"); 
    } 

    return 0; 
} 
+0

'scanf ("% d ", & posothta);' оставляет строку новой строки в буфере, которая будет потребляться следующим 'scanf'. Позвольте мне найти обман, это обычная проблема. –

+0

Вы можете всегда использовать getchar() вместо scanf() для чтения одного символа. –

ответ

4

Когда вы делаете scanf() он принимает значение, которое вы просите только .. например:

scanf("%d",&posothta); 

Допустим, я вхожу 5 здесь. Действительно, stdin получил 2 символа: '5' и '\n' (потому что мне пришлось нажать клавишу ввода и создать символ новой строки).

Итак, в posothta идет 5, но эта надоедливая строка перевода остается сидеть там. Следующий scanf() теперь ищет персонажа, и поскольку символ новой строки ('\n') действительно является персонажем, программа не задает вопросов, она просто берет эту новую строку и движется дальше.

Изменить код:

scanf(" %c",&eidos); 

пропустит сказать scanf(), что «я хочу, чтобы вы, чтобы пропустить пробельные символы, а затем захватить следующий». К scanf() символ пробела содержит не только пробелы, но и символы новой строки.

+0

спасибо :) это работает :) – vdemon001

+0

Этот неправильный ответ! это, возможно, работает, но у вас есть проблема в том, что вы не запустили свой буфер keyborad ..... см. мой ответ –

+0

@Grijesh Chauhan Итак, зачем добавлять пространство перед символом? в чем тут логика? –

0

вам нужно прошить буфер:

printf("Dwse posothta grammatosimwn: "); 
scanf("%d",&posothta); 
flushall(); 
printf("Dwse to eidos grammatoshmou: "); 
scanf("%c",&eidos); 

FlushAll() Функция:

#include <stdio.h> 
int flushall(void); 

Описание: функция

FlushAll() очищает все буферы связанные с вводом и записывает любые буферы, связанные с выходными потоками. A последующая операция чтения во входном файле приводит к чтению новых данных из связанного файла или устройства.

Вызов функции flushall() эквивалентен вызову fflush() для всех файлов открытого потока.

Возвращает:

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

+0

Что такое 'flushall()'? Где он определяется и что он делает? –

+0

@ Daniel Fischer Я добавлю описание этой функции в свой ответ. –

+0

@ DanielFischer - AFAIK это 'flushall()' не POSIX, он привязан к IDE от Microsoft (я видел его один раз с Visual Studio, но он не компилируется с использованием стандартных опций gcc). Один человек-экипаж, исправьте меня, если я ошибаюсь. – Mike

Смежные вопросы