C中scanf()输入分析

 

『写在前面的一些话』


最近写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;
}

猜你喜欢

转载自blog.csdn.net/sinat_40872274/article/details/81414904