C语言编程:字符扫描



scanf字符出现问题…当运行程序时,不要让我输入字符,当我输入整数时,程序打印printf,然后转到最后一个else…

#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;
}

当你做一个scanf()时,它只取你要求的值。例如:

scanf("%d",&posothta);

假设我在这里输入5。实际上,stdin有2个字符:'5''n'(因为我必须按回车键并生成换行符)。

所以在posothta中加入了5,但是那个讨厌的换行符留在了那里。下一个scanf()现在正在寻找一个字符,由于换行符('n')确实是一个字符,因此程序不会问任何问题,它只是选择该换行符并继续前进。

把你的代码改成:

scanf(" %c",&eidos);

Will skip告诉scanf()"我想让你跳过任何空白字符,然后抓住下一个"。对于scanf(),空白字符不仅包括空格,还包括换行符。

你需要flash缓冲区:

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

flushall()函数:

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

描述:

flushall()函数清除与输入相关的所有缓冲区流,并写入与输出流关联的任何缓冲区。一个对输入文件的后续读取操作将导致读取新的数据

调用flushall()函数相当于调用fflush()对于所有打开的流文件。

的回报:

打开的流的数量。在写入时发生输出错误对于一个文件,全局变量errno被设置。

最新更新