#个人随记
想法产生
在输入有多行换行的时候,例如:
1 2
3 2
4 4
...
我在循环中多次记录输入数据,使用scanf(" %d %d")是否会比scanf("%d %d")更好一些?
因为我想着每次输入完之后换行还有换行符\n,前面这种做法是否能有效的吸收掉换行符
结论放开头
并没有~
格式字符串中的空格(如" %d %d")仅用于提高可读性或显式匹配输入中的空白区域,但不会改变%d的默认行为。以下写法完全等效:
scanf("%d%d", ...); // 无空格
scanf("%d %d", ...); // 有空格
scanf(" %d %d ", ...); // 前后有空格
调查分析
scanf(" %d %d")和scanf("%d %d")在功能上是等价的,因为%d会自动跳过所有前导空白字符(包括空格、制表符、换行符\n),格式字符串中的显式空格只是可读性优化,并非必需。无需手动添加空格处理换行符,因为
%d已经隐式跳过空白字符。若输入格式不规范(如混入非数字字符),两种写法都可能出错,需配合输入校验。
详细分析
1. %d的默认行为
%d格式符会自动跳过输入流中的前导空白字符,直到找到非空白字符(即数字或符号)。例如:
// 输入:
// 1 2\n
// 3 4\n
// 5 6\n
int a, b;
while (scanf("%d %d", &a, &b) == 2) { // 正确读取所有行
// 处理a和b
}
2. 格式字符串中空格的作用
格式字符串中的空格(如" %d %d")仅用于提高可读性或显式匹配输入中的空白区域,但不会改变%d的默认行为。以下写法完全等效:
scanf("%d%d", ...); // 无空格
scanf("%d %d", ...); // 有空格
scanf(" %d %d ", ...); // 前后有空格
3. 需要显式处理换行符的场景
仅当输入包含非空白分隔符(如逗号、字母)时,才需显式处理:
// 输入格式为 "1,2\n3,4\n"
int a, b;
scanf("%d,%d", &a, &b); // 必须匹配逗号,否则失败
常见陷阱与解决方案
陷阱1:输入残留换行符导致后续读取错误
若在%d后使用%c或%s,换行符可能残留在输入缓冲区中:
int num;
char ch;
scanf("%d", &num); // 输入"42\n",换行符残留在缓冲区
scanf("%c", &ch); // ch会被赋值为'\n'
解决方案:在%c前添加空格跳过空白符:
scanf(" %c", &ch); // 空格跳过所有前导空白字符
陷阱2:非法输入导致死循环
若输入非数字字符(如字母),scanf会返回0并阻塞,导致无限循环:
while (scanf("%d %d", &a, &b) == 2) { ... } // 输入"abc"时卡死
解决方案:清空输入缓冲区:
#include <stdio.h>
void clear_input_buffer() {
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
int a, b;
while (1) {
if (scanf("%d %d", &a, &b) == 2) {
// 处理a和b
} else {
clear_input_buffer(); // 清除非数字输入
}
}
代码示例
#include <stdio.h>
int main() {
int a, b;
printf("输入多行整数(按Ctrl+D结束):\n");
while (1) {
int result = scanf("%d %d", &a, &b);
if (result == EOF) { // 输入结束
break;
} else if (result != 2) { // 非法输入
printf("输入格式错误,请重新输入一行两个整数!\n");
// 清空缓冲区
while (getchar() != '\n');
continue;
}
printf("读取值: a=%d, b=%d\n", a, b);
}
return 0;
}
总结
无需在
%d格式符前手动添加空格处理换行符,%d已自动跳过所有前导空白。显式空格仅用于匹配输入中的特定分隔符(如逗号、分号)。
若需混合读取数字和非空白字符(如
%c),需注意缓冲区残留问题。始终校验
scanf的返回值,避免非法输入导致程序崩溃。
638

被折叠的 条评论
为什么被折叠?



