引言:scanf函数虽然是学习C语言时比较早就接触的一个函数,但在使用过程中,发现真正掌握它却并不容易。本文就通过各种例子来详细的总结一下该函数的各种用法,假设它的调用格式为 scanf("<格式化字符串>",<地址表>)。
1、一般使用scanf函数时都是为某个变量赋值,不考虑它的返回值。但是任何函数都是需要返回的(即使返回类型用void,也可以认为只是调用了return语句,只是并没有返回什么东西而已),同样的scanf函数也是有返回的,它的返回值是成功读取变量的个数。如果有一个输入与变量格式不匹配,那么返回值为0。如:
- scanf("%d %d", &num1, &num2);
2、scanf函数的<格式化字符串>与后面的<地址表>是必须严格匹配的。注意,是严格匹配,可以说不能有丝毫差别,但对于连续多个空格可以等同于一个空格。如:
- scanf("%d, %d", &num1, &num2);
- scanf("%d,%d", &num1, &num2);
3、scanf函数用%s读取一个字符串时,其实它只能读取一个单词,因为遇到空格时,它会认为输入已结束。因此一般使用fgets来读取一个字符串。如果想用scanf函数读取带有空格的字符串时,需要使用参数%[ ]来完成,它的意思是读入一个字符集合。[ ]是个集合的标志,%[ ]特指读入此集合所限定的那些字符,比如%[A-Z]是输入大写字母,一旦遇到不在此集合的字符便停止。如果集合的第一个字符是“^”,这说明读取不在"^"后面集合的字符,既遇到"^"后面集合的字符便停止(这就是scanf函数里的正则表达式应用)。注意:此时读取的字符串是可以含有空格的。如:
- scanf("1123%s",&str);
- scanf("%[^\n]", &str);
scanf("%[A-Z]",&str);输入除A到Z的任何字符(包括空格、回车)都会停止。
4、对于下面两条语句
- scanf("%d ", &num);/*scanf("%d\n", &num);*/
- printf("%d",num);
5、对于scanf函数的%c格式转换符,可以接受任何的非空白字符或空白字符(包括空格、回车、Tab甚至是F2这样的字符)。
- char str;
- scanf("%c", &str);
- printf("str = %c\n", str);
如果输入:空格……/*……代表任意空白字符或非空白字符*/,则str被赋值为空格。
如果输入:回车,则str被立即赋值为换行字符‘\n’。
如果输入:fjdkfj,则str被赋值为f,f后面的jdkfj丢弃。