C语言中scanf()函数是从标准输入流stdin中读取信息的,很多时候调用scanf()函数却得不到想要的信息,可以从这方便考虑解决问题。
fflush(stdin);
是个不错的方法。
想要用scanf()函数读入空白字符,回车符和换行符这些字符,就需要提到scanf()函数的格式说明符:
转换字符(就是%后跟的部分)
a 读浮点值(仅适用于 C99)
A 读浮点值(仅适用于 C99)
c 读单字符
d 读十进制整数
i 读十进制、八进制、十六进制整数
e 读浮点数
E 读浮点数
f 读浮点数
F 读浮点数(仅适用于 C99)
g 读浮点数
G 读浮点数
o 读八进制数
s 读字符串
x 读十六进制数
X 读十六进制数
p 读指针值
n 至此已读入值的等价字符数
u 读无符号十进制整数
[ ] 扫描字符集合
% 读 % 符号(百分号)
附加格式说明字符表修饰符说明
L/l 长度修饰符 输入"长"数据
h 长度修饰符 输入"短"数据
W 整型常数 指定输入数据所占宽度
* 表示本输入项在读入后不赋值给相应的变量
上面提到的 扫描字符集合 []就是关键,它使得读入空白字符成为可能。如下所示:
#include
#include
int main()
{
char
str1[80], str2[80];
memset(str1, 0, 80);
memset(str2, 0,
80); //这个地方可以设不同的值- -,显示的时候很有趣
scanf("%[^\n]%*5c%[^\n]", str1, str2);
printf("%s\n%s\n", str1, str2);
return
0;
}
上面代码使得空格,制表符作为输入成为可能,其中 %[^\n] 表示除了换行符\n之外的字符都接收。
如想要接收换行符\n作为输入,只需要在扫描字符集中添加\n即可。
注意:
回车符是特殊字符,在scanf("%[^\n]", str)之后需要增加scanf("%c", newline),消除回车符。否则,只要接收到一个回车符scanf会不停止运行。