『写在前面的一些话』
最近写PAT,发现很多题目对输入的要求很高。所以就整理一下。
scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
其调用格式为: scanf("<格式化字符串>",<地址表>);
scanf()函数返回成功赋值的数据项数,出错时则返回EOF。
1).格式化说明符
格式字符 | 说明 |
%a | 读入一个浮点值(仅C99有效) |
%A | 同上 |
%c | 读入一个字符 |
%d | 读入十进制整数 |
%o | 读入八进制整数 |
%x | 读入十六进制整数 |
%i | 读入十进制,八进制,十六进制整数 |
%s | 读入一个字符串 |
%f | 读入一个单精度浮点数 |
%e |
同上 |
%g | 同上 |
%p | 读入一个指针 |
%u | 读入一个无符号十进制整数 |
%n | 至此已读入值的等价字符数 |
%[] | 扫描字符集合 |
%% | 读%符号 |
2) “*”符
用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。如:
scanf("%d %*d %d",&a,&b);
当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。
3) 宽度
用十进制整数指定输入的宽度(即字符数)。例如:
scanf("%5d",&a);
输入12345678只把12345赋予变量a,其余部分被截去
4) 长度
长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf)。h表示输入短整型数据
5) 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。没有默认是"空格","Tab","换行"
例如:
scanf("%d,%d,%d",&a,&b,&c);
『最常遇到的问题』
#include <cstdio>
using namespace std;
int main()
{
char str[80];
scanf("%s",str);
printf("%s",str);
return 0;
}
scanf()函数不能正确接受有空格的字符串?如: I love you!
输入:I live you!
输出:I
(当然了,首先是想到gets(),gets()当然可以用。但由于gets()存在非法内存的问题。所以还是最好选用scanf()。)
scanf函数用%s读取一个字符串时,其实它只能读取一个单词,因为遇到空格时,它会认为输入已结束。因此一般使用fgets来读取一个字符串。
如果想用scanf函数读取带有空格的字符串时,需要使用参数%[ ]来完成,它的意思是读入一个字符集合。[ ]是个集合的标志,%[ ]特指读入此集合所限定的那些字符,比如%[A-Z]是输入大写字母,一旦遇到不在此集合的字符便停止。如果集合的第一个字符是“^”,这说明读取不在"^"后面集合的字符,既遇到"^"后面集合的字符便停止(这就是scanf函数里的正则表达式应用)。注意:此时读取的字符串是可以含有空格的。如:
#include <cstdio>
#include <bits/stdc++.h>
using namespace std;
int main(){
char str[100];
scanf("%[^\n]",str);
cout<<str;
return 0;
}