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; }