scanf和sscanf是C语言中常用的格式化输入函数。常用于从标准输入或者字符串中,按照一定的格式,将输入赋值给变量。
int scanf(const char *format, ...)
int sscanf(const char *str, const char *format, ...)
除了常用的获取整型、字符串等数据外,还有以下三种用法比较实用:
一、读取多个变量 1.通常情况当读取多个变量是,在format参数里通常使用一个或多个空格、回车、制表符进行分割。
2.使用其它字符分割多个变量当然也可以用其它的字符进行分割,比如’,'逗号。但是用其它的字符分割的话,在标准输入端输入的时候就需要出现相同的字符对数据进行分割。比如下面的代码:
int main()
{
int a,b;
scanf("%d,%d",&a,&b);
printf("a=%d,b=%dn",a,b);
return 0;
}
那么在输入的时候就需要用逗号分割两个输入的数字,如输入"12,34",这样变量a和b才能够正确的。
如果使用上面代码,但是不用逗号分割两个输入的数字,那么就会出现读取错误,如下图所示。
注意:如果要读取字符串,那么不要用逗号进行分割,因为输入的逗号会被读取走,从而导致分割失败,如下面的代码:
int main()
{
int a,b;
char buf1[20],buf2[20];
scanf("%s,%s",buf1,buf2);
printf("a=%s,b=%sn",buf1,buf2);
return 0;
}
当读取输入时,会发现逗号没有起到分割的作用,见下图。第二个字符数组没有被赋值。
所以在读取多个变量的时候,尽量用空格、回车、制表符进行分割。
二、星号*的用法在读取多个变量的时候,当输入中的一部分需要跳过,不用赋值给变量的时候,可以使用"*"星号。
如下面代码:
int main()
{
int a,b;
scanf("%d %*d %d",&a,&b);
printf("a=%d,b=%dn",a,b);
return 0;
}
当我们输入3个数字,只想取第一个和第三个进行赋值时,就可以对第2个用星号* 。可以看到下面的输入,中间的34就没有被赋值,而是跳过了。
三、中括号[]的用法中括号的作用是匹配一个字符集合,有两种用法:
1. 对多个字符进行匹配,如"%[0-9]" 或者 “%[abc]”见如下代码,其匹配三个变量,分别是数字、字母和符号。
int main()
{
char buf1[20],buf2[20],buf3[20];
scanf("%[0-9]%[a-z]%[,.?]",buf1,buf2,buf3);
printf("buf1=%snbuf2=%snbuf3=%sn",buf1,buf2,buf3);
return 0;
}
当输入"123abcd?,1234"时,输出结果如下
在中括号中的’'符号,表示配置字符,直到之后的字符出现,比如下面的代码:
int main()
{
int a;
char buf1[20];
scanf("%[^,],%d",buf1,&a);
printf("buf1=%sna=%dn",buf1,a);
return 0;
}
%[^,]的意思是读取字符直到遇到’,'逗号,例如输入"123abc123,89"是,"123abc123"将放入buf1数组中,而逗号后面的"89"将赋值给变量a。见下图:



