问题:
以如下问题为例
问题代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char c;
while (scanf("%c",&c) != EOF)
{
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
问题输出:
问题分析:
如上述代码运行输出所示发现:不论输入的字符是否是一个字母,做完相应判断后输出的都会比目标输出多一个"NO",那这多出的一个"NO"是从哪来的?
当我们进行输入时,通常再按一下回车才会有输出,而这多出一个"NO"就是对这个回车输入做出的判断输出,按下的回车键对应的是换行字符'\n',对应的ASCII码值为10,不符合字母输入要求,所以输出"NO"。
解决方法①
修改代码循环输入为单次输入,但此方法不能连续测试输入:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char c;
scanf("%c", &c);
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}
解决方法②
增加对换行符输入的判断:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char c;
while (scanf("%c", &c) != EOF)
{
if (c == 10)
{
}
else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
解决方法③
增加对'\n'的“清理”:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int c;
while ((c = getchar()) != EOF)
{
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
getchar(); //清理'\n'
}
return 0;
}
测试结果:
以上为个人学习理解,如有错误,希望大家帮忙指正,也欢迎大家给予建议和讨论,谢谢!