1. 对于上一篇文章,总结printf()输出,C库也包含了多个输入函数, scanf()是最常用的一个,也是经常与printf()经常一起搭配使用的函数之一.
scanf()和printf()类似, 也是使用格式字符串和参数列表. scanf中的格式字符串表明字符输入流的目标整数类型.两个函数主要的区别在参数列表中. printf()函数使用变量, 常量和表达式, 而scanf()函数使用指向变量的指针, 指针将在后续学习中总结. 使用scanf()有一下两个规则:
1⃣️ 如果用scanf()读取基本变量类型的值, 在变量名前加上一个&;
2⃣️ 如果用scanf()把字符串读入字符串数组中, 不要使用&.
举例一:
#include <stdio.h> int main(int argc, const char * argv[]) { int age; float assets; char per[30]; printf("Enter your age,assets,and favorite "); scanf("%d",&age); scanf("%f",&assets); scanf("%s",per); printf("%d, $%.2f %s ",age,assets,per); return 0; }
打印结果
Enter your age,assets,and favorite 27 43.25 apple 27, $43.25 APPLE Program ended with exit code: 0
2. 总结完基本规则, 我们先把列表转换说明附上
ANSI C 中scanf基本转换说明
ANSI C 中scanf转换说明修饰符
3. 从scanf() 角度看输入
假设scanf()根据一个%d转换说明读取一个整数. scanf()函数每次读取一个字符, 跳过所有的空白字符, 直至遇到第一个非空白字符才开始读取. 因为要读取整数, 所以scanf()希望发现一个数字字符或者一个符号(+或-).如果遇到一个数字或符号, 它便保存该字符, 并读取下一个字符. 如果下一个字符是数字, 它便保存该数字并读取下一个数字. scanf()不断第读取和保存, 直到遇到非数字字符. 如果读取到一个非数字字符, 它便认为读到了整数的末尾. 然后,scanf()把非数字字符放回输入. 这意味着程序在下一次读取输入时, 首先读到的是上一次丢弃的非数字字符. 最后, scanf()计算已读取数字(可能)相应的数值, 并将计算后值放入指定的变量中.
示例二:
#include <stdio.h> int main(int argc, const char * argv[]) { int age; char name[40]; scanf("%d",&age); scanf("%s",name); printf("%d,and %s ", age,name); return 0; }
打印结果
78 wuhan 78,and wuhan Program ended with exit code: 0
4. 如果使用字段宽度, scanf()会在字段结尾或第一个空白字符处停止读取( 满足两个条件之一就停止)
#include <stdio.h> int main(int argc, const char * argv[]) { char name[40]; scanf("%10s",name); printf("%s ",name); return 0; }
在运行中输入 ‘wuhanHangzShanghai’,打印结果
wuhanHangz
5 如果使用%s转换说名, scanf()会读取除空白以外的所有字符. scanf()跳过空白字符开始读取第一个字符非空白字符. 并保存非空白字符直到遇到空白字符. 这意味这scanf()根据%s转换说明读取i一个单词, 即不包含空白字符的字符串.
如果使用字段宽度, scanf() 在字段末尾或者第一个空白字符处停止读取. 无法利用字段宽度让只有一个%s的scanf()读取多个单词. 最后注意一点: 当scanf()把字符串放进指定数组中时, 它会在字符序列末尾加上‘