C语言中scanf格式说明符前后加空格是否必要?
scanf格式串中空格的作用详解
1. 格式说明符前添加空格是否重要?
得看对应的格式说明符类型:
- 对于数值类格式符(如
%d、%f、%lf等):这类格式符本身会自动跳过输入开头的所有空白字符(空格、换行、制表符),所以在前面加空格" %d"和不加"%d"的效果完全一致,没区别。 - 对于非数值类、不自动跳过空白的格式符(如
%c、%[、%n):这类格式符默认会读取输入流中的第一个字符,包括空白。这时候前面加空格就非常关键——" %c"会让scanf先跳过所有空白字符,直到遇到第一个非空白字符才读取,能避免读取到之前输入残留的换行、空格等无效字符。
示例对比:
// 不加空格的%c会读入回车符 int num; char ch; scanf("%d", &num); // 输入10后回车 scanf("%c", &ch); // ch被赋值为换行符'\n' // 加空格后跳过回车,读入实际需要的字符 scanf("%d", &num); scanf(" %c", &ch); // 跳过回车,等待输入下一个非空白字符
2. 格式说明符后添加空格的效果与前加空格一致吗?
完全不一致,两者作用逻辑差异很大:
- 格式符前加空格:在匹配格式符对应内容之前,跳过所有空白字符。
- 格式符后加空格:匹配完格式符对应内容后,scanf会持续跳过输入流中的所有空白字符,直到遇到非空白字符才结束当前scanf调用。也就是说,输入完格式符对应的内容后如果只有空白(比如回车、空格),scanf会一直阻塞等待,直到输入非空白内容。
示例对比:
// 前加空格:输入123回车后立即完成读取 scanf(" %d", &num); // 后加空格:输入123回车后程序不会继续,必须输入非空白字符才会返回 scanf("%d ", &num); // 输入123回车后,程序卡住,直到输入'a'或另一个数字,scanf才结束
%c的情况同理:
// 前加空格:跳过空白,读取第一个非空白字符 scanf(" %c", &ch); // 后加空格:读取字符后跳过后续空白,必须输入非空白才结束 scanf("%c ", &ch); // 输入'a'回车后程序卡住,直到输入下一个非空白字符
内容的提问来源于stack exchange,提问作者Devil
相关产品推荐
相关产品推荐

