1、scanf 尾随空白的行为
在 scanf
的格式字符串中,如果在转换说明符后放置了空白字符,例如 " %d
" 或 " %c\n
",scanf
会尝试跳过输入中的所有空白字符(如空格、换行符、制表符),直到读取到一个非空白字符。这可能会导致 scanf
在输入中等待,直到有新的非空白字符输入为止。
#include <stdio.h>
int main() {
int num;
char ch;
printf("Enter a number: ");
scanf("%d ", &num); // 格式字符串中有尾随空白
printf("Enter a character: ");
scanf("%c", &ch);
printf("Number: %d\n", num);
printf("Character: %c\n", ch);
return 0;
}
2、正确处理尾随空白的方法
避免尾随空白,在格式字符串中尽量避免尾随空白字符,除非确实需要跳过空白字符。
使用 %*c
跳过换行符,如果只想跳过换行符,可以使用 "%d%*c
" 的方式读取整数并跳过一个字符。
谨慎处理 %c
和 %s
,在读取字符(%c
)或字符串(%s
)之前,可以使用 " %c
" 或 " %s
" 来跳过输入中可能存在的空白字符。
#include <stdio.h>
int main() {
int num;
char ch;
printf("Enter a number: ");
scanf("%d", &num); // 避免尾随空白
printf("Enter a character: ");
scanf(" %c", &ch); // 在 %c 前放置一个空格,跳过空白字符
printf("Number: %d\n", num);
printf("Character: %c\n", ch);
return 0;
}
3、正确处理换行等特殊字符的方法
如果需要在读取不同类型的数据之间处理换行,可以使用getchar()
来手动捕获换行符。
#include <stdio.h>
int main() {
int a;
char c;
printf("请输入一个整数:");
scanf("%d", &a); // 读取整数并存储在变量 a 中
getchar(); // 读取并丢弃换行符
printf("请输入一个字符:");
scanf("%c", &c); // 读取单个字符并存储在变量 c 中
// 输出读取到的值
printf("您输入的整数是:%d\n", a);
printf("您输入的字符是:%c\n", c);
return 0;
}
4、使用%*c跳过特定字符
在某些情况下,可以使用%*c
来跳过一个字符,例如换行符,
#include <stdio.h>
int main() {
int a;
printf("请输入一个整数: ");
scanf("%d%*c", &a); // 读取整数并跳过换行符或其他尾随字符
printf("您输入的整数是:%d\n", a);
// 继续其他输入操作
printf("请输入另一个整数: ");
int b;
scanf("%d%*c", &b); // 再次读取整数并跳过尾随字符
printf("您输入的第二个整数是:%d\n", b);
return 0;
}