2.5.2 scanf 函数
既然 printf 函数是用于打印输出的,那么有没有进行数据输入的函数呢?当然有,就是 scanf 函数。scanf 函数与 printf 函数类似,第一个参数是一个“格式化字符串”,并且也可以根据需要来使用“占位符”和“修饰符”。scanf 函数的功能是将用户在控制台窗口中的输入依据“占位符”的指示转换成相应类型的数据保存到变量中。再形象一些,用户使用键盘在控制台窗口里的输入虽然都是些字符,但通过“占位符”可以把这些字符理解为整型、实型、字符型或字符串等数据类型,把它们收集起来并存储在相应的变量中。
因为要将数据保存到变量中,所以在使用 scanf 函数时要注意,需要在后面的参数变量名前加上一个“&”符号,表示取变量的内存地址。至于为什么要加取地址符,现在不必纠结,等到后面学习使用指针的时候就明白了。
下面用例子展示一下 scanf 函数的使用方式。
在这个 scanf 函数中,格式化字符串里只有一个占位符“%d”,它表示将用户的输入按照整数的形式读取并保存到变量 n 中。变量 n 前面的“&”符号是必需的。
把这三行代码放在 main 函数中,编译生成可执行文件。然后执行程序时,会看到窗口中的光标不停地闪烁,它表示程序正在等待用户的输入。我们通过键盘在窗口输入一串数字字符“1234”,然后按下回车键,这时 scanf 函数就会把“1234”作为一个整数 1234 读取并保存到变量 n 中,最后会通过 printf 函数在窗口打印输出“you input integer is : 1234”。
如果我们把代码修改一下:
变量类型从 int 改为 float,scanf 函数中的占位符也就相应从“%d”改为“%f”。程序运行后,同样地,我们还是在窗口中输入一串数字字符“1234”,然后按下回车键。这次 scanf 函数就会把“1234”作为一个单精度浮点数读取并保存到变量 flt 中,最后通过 printf 函数在窗口打印输出“you input float is : 1234.000000”。
我们还可以使用 scanf 函数一次性读取多个不同数据类型的数据,例如:
char ch; int n; float flt; scanf("%c%d%f", &ch, &n, &flt);
在 scanf 函数的格式化字符串中连续有 3 个占位符,表示会分别把用户的输入按字符、整型和单精度浮点数的形式进行读取,并保存到相应的变量中。用户在输入时要注意,每个数据之间要留有空白字符(例如空格字符),不要连在一起,如:“A 100 3.14”,这样通过 scanf 函数最终会让变量 ch 的值为'A',变量 n 的值为 100,变量 flt 的值为 3.14。如果把所有输入字符都连在一起,如“A1003.14”,那么最终结果就会有所不同,变量 ch 的值依然为'A',但变量 n 的值变为 1003,变量 flt 的值变为 0.14。
下面再讲一下使用 scanf 函数时的一些注意点。
scanf 函数在读取字符型数据时,会将用户输入的第一个字符(包含空白字符)读取进来,并保存到字符变量中。所谓空白字符包括空格、水平制表符以及换行符等这些不可见的字符。
scanf 函数在读取非字符型数据时,会自动跳过用户输入中的前导空白字符,从第一个合法字符开始读取,直到遇到空白字符或非法字符时才停止读取,然后把这些字符转换成对应的数据保存到变量中。什么是合法字符呢?例如,如果读取的是一个十进制整数,合法字符就是指 0~9 这些数字字符;如果读取的是一个八进制数,合法字符就是指 0~7 这些数字字符;如果读取的是一个十六进制数,合法字符就是指 0~9 这些数字字符以及 A~F、a~f 这些字符;如果读取的是一个浮点数,那么合法字符除了包括 0~9 这些数字字符外,还包括一个表示小数点“.”的字符。
scanf 函数的格式化字符串中尽量不要包含占位符之外的其他字符,因为用户必须严格按照格式化字符串的格式进行输入,否则很容易导致错误。
int n; scanf("Num:%d", &n); //格式化字符串中使用了占位符之外的字符
在此例中,格式化字符串内容为“Num:%d”,那么在程序执行后,如果想让变量 n 的值为 1234,则用户在控制台窗口进行输入时,不可直接输入“1234”,必须严格按照格式进行输入,如“Num:1234”,否则就会造成读取错误,导致变量 n 得不到期望的数值。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论