14 字母的前趋或后继
作者: 赵炜琦时间限制: 1S章节: 分支结构
问题描述 :
输入一个小写英文字母。如果这个字母是英文字母表的前13个字母中的一个(m字母及m以前的字母),则输出它的后一个字母;否则输出它的前一个字母。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据占一行,由一个小写字母组成。在行首和行尾没有多余的空格。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端)依次输出一组对应的答案。对应每一个输入的小写字母,输出它对应的前趋或后继字母,每行一个。在所有数据前后不要输出多余的空行,两组数据之间也不要输出多余的空行。
输入范例 :
a
m
n
y输出范例 :
b
n
m
x
笔记
这道题的题干和第八题相同,主要考察的是字符的多点输入。
这道题要求从键盘读入,若直接使用scanf("%c",&c)会出现PE,用scanf("%c\n",&c)也是不行的。
stdin具有缓存区,当你键盘输入的字符还没有按下ENTER键时都是存在缓存区中的,当按下ENTER后,开始读取缓存区,这时才会有你输入的字符c与ENTER(ENTER在ASCII码中值为10)。
若用scanf("%c",&c)进行读入,输入时敲的回车键也会被读进去。
百度知道建议在输出时使用fflush清空缓存,但这是不被OJ允许的:
WA:测试数据运行错误。注意:有两种情况可能导致自己运行程序时正确但OJ系统给出错误结果:
1、如果在程序中使用了fflush函数清空输入,可能导致WA。
2、如果是输入字符串,OJ系统的测试数据最后一行后面不一定有换行符,但我们在键盘上输入时每一行后面都必然有换行符。所以,要当心这个区别。
那怎么办呢?
只能使用getchar(),每次仅输入一个字符。但这么做仍然会把键盘输入的回车符读进来。
解决方法很简单,即加一个判断,若输入字符的为回车符,则什么也不做。
输出的时候用printf()和putchar()都可以,但需要注意的是,若使用putchar()进行输出,还要在末尾加个换行。
代码
#include<stdio.h>
int main(){
int c;
c = getchar();
while( c != EOF) {
if(c!=10){
if(c>='a' && c<='m'){
// putchar(c+1);
printf("%c\n",c+1);
}
else{
// putchar(c-1);
printf("%c\n",c-1);
}
}
c = getchar();
}
return 0;
}