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的任意字符,贪婪性

猜你喜欢

转载自blog.csdn.net/weixin_42216720/article/details/120624084