如何处理标准输入中的额外换行符
How to handle the extra newline character in stdin
考虑以下程序:
#include<stdio.h>
int main(){
char c;
printf("Want to continue? :");
scanf("%c",&c);
while(c=='y')
{
printf("Want to continue? :");
scanf("%c",&c);
}
return 0;
}
这里需要的是程序继续运行,直到用户继续输入字符 y
。
但即使用户输入 y
,它也会在第一次迭代后退出。根据我的理解,这是
发生的,因为当我输入 y
时,我也输入了一个新行,所以下一次 scanf 将获取这个
换行符而不是我输入的字符输入。
避免这种情况的一种方法是在每次 scanf 之后简单地使用 getchar()
,这样它就可以简单地吃掉新行
字符。有没有更好的替代品?
只需在要阅读的字符前添加一个space即可。
scanf(" %c",&c);
放在之后会引起麻烦:What is the effect of trailing white space in a scanf() format string?)
编辑:回答你关于它为什么有效的问题。好吧,因为这就是 scanf
的构建方式。在本页http://www.cplusplus.com/reference/cstdio/scanf/您可以阅读:
白色space字符:该函数将读取并忽略在下一个非白色space字符之前遇到的任何白色space字符(白色 space 字符包括 spaces、换行符和制表符——参见 isspace)。 格式字符串中的单个白色space验证从流中提取的任意数量的白色space字符(包括none)。
考虑以下程序:
#include<stdio.h>
int main(){
char c;
printf("Want to continue? :");
scanf("%c",&c);
while(c=='y')
{
printf("Want to continue? :");
scanf("%c",&c);
}
return 0;
}
这里需要的是程序继续运行,直到用户继续输入字符 y
。
但即使用户输入 y
,它也会在第一次迭代后退出。根据我的理解,这是
发生的,因为当我输入 y
时,我也输入了一个新行,所以下一次 scanf 将获取这个
换行符而不是我输入的字符输入。
避免这种情况的一种方法是在每次 scanf 之后简单地使用 getchar()
,这样它就可以简单地吃掉新行
字符。有没有更好的替代品?
只需在要阅读的字符前添加一个space即可。
scanf(" %c",&c);
放在之后会引起麻烦:What is the effect of trailing white space in a scanf() format string?)
编辑:回答你关于它为什么有效的问题。好吧,因为这就是 scanf
的构建方式。在本页http://www.cplusplus.com/reference/cstdio/scanf/您可以阅读:
白色space字符:该函数将读取并忽略在下一个非白色space字符之前遇到的任何白色space字符(白色 space 字符包括 spaces、换行符和制表符——参见 isspace)。 格式字符串中的单个白色space验证从流中提取的任意数量的白色space字符(包括none)。