scanf("%d%d", &a, &b);这种为什么我输入12,不把1赋值给a,2赋值给b结束,而是空格或者回车等空白输入一个数字结束
为什么 scanf("%d%d", &a, &b) 不会把 "12" 拆分成 1 和 2
1. %d 的解析规则
%d 会:
连续读取数字字符直到遇到非数字字符
将这一整串数字字符作为一个完整的整数解析
遇到空白字符或文件结束时才完成一个 %d 的读取
// 输入 "12" 时:
scanf("%d%d", &a, &b); 等价于scanf("%d %d", &a, &b); 因为%d会自动默认跳过空白符,写上和不写空白都会匹配任意空白
如果没有指定分隔符,空白符默认是一个数字的分隔符
scanf("%d %d", &a, &b)这种可读性高,因为如果不知道%d会自动默认跳过空白符,这种加个空白符就可以很清楚了
// %d 会读取连续的数字字符 "12",将其解析为整数 12
// 然后赋值给 a
// 第二个 %d 还在等待输入,因为还没有遇到分隔符
scanf 需要某种方式知道一个数字在哪里结束,下一个数字在哪里开始: c // 正确的分隔方式: 输入 "12 34" → a=12, b=34 // 空格分隔 输入 "12,34" → a=12, b=34 // 逗号不是%d的默认分隔符 输入 "12\n34" → a=12, b=34 // 换行符分隔 输入 "12\t34" → a=12, b=34 // 制表符分隔
// 这些都会正确分隔:
"12 34" // 空格分隔
"12,34" // 如果用 "%d,%d" 格式
"12:34" // 如果用 "%d:%d" 格式
"12\n34" // 换行分隔