C语言scanf()和sscanf()函数详解
作者:互联网
sscanf()与scanf()类似,都是用于输入的,只是scanf()以键盘(stdin)为输入源,sscanf()以固定字符串为输入源
一:scanf()
头文件:
#include <stdio.h>
函数原型:
int scanf(const char *format,...);
函数功能:按指定格式从键盘输入数据,存入地址表指定的存储单元中,并按回车键结束。
函数参数:format 指定输入格式,后面跟要输入的变量的地址表,为不定参,用"..."表示。
函数返回:正常,返回输入数据的个数。失败返回-1(EOF)
地址表:变量的地址,常用取地址运算符&
scanf支持的格式说明符:
i,d | 十进制整数 |
x,X | 十六进制无符号整数 |
o | 八进制无符号整数 |
u | 无符号十进制整数 |
c | 单一字符 |
s | 字符串 |
e | 指数形式浮点小数 |
f | 小数形式浮点小数 |
scanf函数支持的格式说明符可以带一下修饰字符:
修饰符 | 功能 |
h | 用于d,o,x前,指定输入位short型整数 |
l | 用于d,o,x前,指定输入位long型整数 用于e,f前,指定输入位double型实数 |
m | 指定输入数据宽度,遇空格或不可转换的字符结束 |
* | 抑制符,指定输入项读入后,不赋给变量 (eg: %*4d ,*是抑制符,4d指定输入项中4个数字读入后不赋给变量) int a; float c; printf("inpput int float:"); scanf("%3d%*4d%f",&a,&c); printf("a=%d,c=%f",a,c); 程序运行如下: input int float:123456789 a=123,c=890.000000 |
注意事项:
用scanf进行输入时,不能再格式字符串中输入普通字符用于提示的作用,也不能再格式字符后加'\n'
用%c格式符时,空格和转义字符作为有效字符输入。
总结:
输入数据时,遇到以下情况认为该数据结束:
1.遇空格,TAB,或回车
2.遇非法输入
3.遇宽度结束
清除输入函数留下的垃圾:
1.用getchar()函数来进行清除
2.用格式串中空格清除
3.用%*c来进行清除
二:sscanf()
头文件:
#include <stdio.h>
函数原型:
int sscanf (char *str, char * format [, argument, ...]);
函数功能:用于从字符串中读取指定格式的数据
函数参数:参数str为要读取数据的字符串;format为用户指定的格式;argument为变量,用来保存读取到的数据。
函数返回值:成功则返回参数数目,失败则返回-1,错误原因存于errno 中。
sscanf()会将参数str 的字符串根据参数format(格式化字符串)来转换并格式化数据(格式化字符串请参考scanf()), 转换后的结果存于对应的变量中。
实例:
#include <stdio.h>
int main(void)
{
char str[100] ="123568qwerSDDAE";
char lowercase[100];
int num;
sscanf(str,"%d %[a-z]", &num, lowercase);
printf("The number is: %d.\n", num);
printf("The lowercase is: %s.", lowercase);
return 0;
}
执行结果:
The number is: 123568.
The lowercase is: qwer.
可以看到format参数有些类似正则表达式(当然没有正则表达式强大,复杂字符串建议使用正则表达式处理),支持集合操作,例如:
%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB'] 匹配a、B、'中一员,贪婪性
%[^a] 匹配非a的任意字符,贪婪性
标签:sscanf,int,scanf,C语言,字符串,格式,输入 来源: https://blog.csdn.net/weixin_42216720/article/details/120624084