格式化输入输出函数
所谓格式化输入输出,就是不再如同上一节介绍的函数那样,都是单纯地输入输出一个字符或者一行文字。格式化输入输出,就是要将各种类型数据(包括整型、浮点型以及字符串等类型的常量或变量),混合在一起进行输入输出。在C语言中格式化输入函数主要使用scanf(或scanf_s)函数,格式化输出函数主要是printf函数。
格式化输入输出函数,能够对各种类型的数据混合地输入输出,主要是依靠一个格式控制字符串来实现的。在格式控制字符串内通过%符号加字母,对输入输出的目标数据的类型进行预先标明。控制字符串内的%符号后面的字母,我们称之为输入输出控制符。控制字符串内的每一个控制符,在控制字符串后面必须有一个相应类型的常量、变量或表达式。控制串内的控制字符与控制串后面的输入输出目标,在类型与个数上必须是一一对应的,否则在输入输出时就会出现混乱。
scanf函数
scanf函数从标准输入流中,读取用户输入一段或多段文字,并将每段文字转换到各种类型的变量中去。
函数格式:int scanf( const char *format, ... );
scanf函数主要分为控制字符串与列表参数两部分。控制字符串也就是双引号内的部分,只允许放两种文字:控制符与间隔符。控制字符串内多段控制符之间,只能是空格、逗号或者单独指定的某种间隔符。如果在控制串内随意加入一些文字,尤其是想把要打印的文字放入scanf函数的控制字符串内,那将是非常错误的。例如:scanf(“请输入你的工号%d和姓名%d”, &n, &s); 这样的语法不但会被笑掉大牙,而且程序运行的结果也不如所想。
[例3-7] 测试scanf的控制字符串 //scanf的控制字符串内除了控制符外,就只能时间隔符号了。 #include <stdio.h> int main( ) { int nNumb; char sName[20]; //下面这行代码是一个错误的scanf的用法 scanf("请输入你的工号%d和姓名%s", &nNumb, &sName); printf("你输入的工号是:%d \n", nNumb); printf("你输入的姓名是:%s \n", sName); return 0; } /* printf("请输入一个员工的工号、姓名【以空格间隔】\n"); scanf("%d %s", &nNumb, &sName); */ |
将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
a)运行之后观察是否有打印出“请输入……”的提示文字,输入一个工号和姓名后能否打印出输入的内容;
b)最好能在调试模式下单步执行,在监视器内观察scanf函数执行后,两个变量内的数据是否发生了变化;
c)用下方注释内的两行代码,代替语法错误的scanf那一行代码,再重新编译运行并查看结果;
d)最好能在调试模式下单步执行,观察scanf函数执行后两个变量内数据的变化情况。
结论:如果你想要先对用户提示再让其输入数据,你就必须用两行代码来实现。而不能像[例3-7]那样,直接将要输出的文字放在scanf的控制字符串中。
scanf函数的参数列表
在C语言中只有极少数的函数,带有…这样的参数格式,scanf与printf函数就属于这种特殊的函数。
这三个点代表控制字符串之后的参数列表中,参数的个数不受限制。普通函数的参数个数必须是固定的,比如getchar函数的参数个数是0个,putchar函数的个数是1个。如果调用普通函数时,参数的个数或类型不匹配,编译器在编译时都会报错。
值得注意的是:scanf的参数列表内,带入的每个变量都必须用&符号取变量的地址。取变量的地址带入之后,在输入数据之后scanf才将用户输入的数据,能按照每个变量的地址送入到对应的变量中。
[例3-8] 测试scanf的参数列表 //参数列表中的变量忘记了取地址的话,问题很严重。 #include <stdio.h> |