C语言 scanf格式字符串中的尾随空白字符问题

C语言的 scanf 函数中,格式字符串中的尾随空白字符(空格、制表符、换行符等)会影响输入的读取方式。具体来说,格式字符串中的尾随空白字符会导致 scanf 跳过所有连续的空白符,直到读取到下一个非空白字符才会停止。这种行为在读取字符时尤其需要注意,因为它可能会导致程序等待输入,或者忽略特定字符。

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

推荐阅读
cjavapy编程之路首页