C语言用for循环填充一维数组时第二种scanf多值接收逻辑疑问
关于scanf结合for循环批量接收输入的原理说明
scanf("%d", ...)格式符读取整数时,默认会自动跳过输入缓冲区中所有的前置空白字符(包括空格、换行符、制表符),只要缓冲区中有符合要求的整数,就会直接读取赋值,不会强制要求用户触发新的输入操作,两个方案的核心逻辑没有本质差异,仅提示打印的时机不同:
两个方案的代码对比
第一种方案
//first solution #include <stdio.h> int main() { int pin[4],i; for(i=0; i<4; i++){ printf("Give value: "); scanf("%d", &pin[i]); } return 0; }
每次循环都会先打印单次输入提示,再执行一次scanf读取整数,用户可以每次输入1个值按回车完成赋值,也可以一次性输入4个用空格分隔的值,后续3次scanf会直接从缓冲区读取剩余值,只是后面3次的提示会等所有值读取完成后才会依次打印。
第二种方案
//second solution #include <stdio.h> int main() { int pin[4],i; printf("Give 4 values: "); for(i=0; i<4; i++){ scanf("%d", &pin[i]); } return 0; }
程序启动后先打印批量输入提示,再进入4次循环:
- 如果用户一次性输入4个用空格分隔的整数后按回车,4个值会全部进入输入缓冲区,4次
scanf会依次从缓冲区读取每个值完成数组赋值,不需要额外触发输入动作 - 如果用户分4次每次输入1个值按回车,运行效果和第一种方案完全一致,因为换行属于空白字符,会被
scanf自动跳过
内容的提问来源于stack exchange,提问作者dimostsigour
相关产品推荐
相关产品推荐

