有没有办法在 scanf() 函数中强制输入空格?

Kai*_*aha 3 c whitespace input scanf

例如,我想让用户在值之前键入所需的消息,如下所示:

scanf(" Message%c", &character);
Run Code Online (Sandbox Code Playgroud)

没关系,但是我希望这条消息包含一些像这样的空格:

scanf(" A required message %c", &character);
Run Code Online (Sandbox Code Playgroud)

编译器不会抱怨任何东西,但空格无关紧要,输入:

A required message C
Run Code Online (Sandbox Code Playgroud)

ArequiredmessageC
Run Code Online (Sandbox Code Playgroud)

给出相同的结果。

有没有办法让这些空格成为强制性的?

chq*_*lie 8

您可以使用%[带有1长度修饰符和 a的转换说明符*来禁止赋值:

if (scanf("%*1[ ]A%*1[ ]required%*1[ ]message%*1[ ]%c", &character) == 1) {
    // Input is conforming, last character is in `character`
} else {
    // Input is not as expected...
    // but there is no way to tell how many characters were correct
}
Run Code Online (Sandbox Code Playgroud)

这非常繁琐且难以阅读。您可以使用fgets()以下替代方法:

char buf[80];
if (fgets(buf, sizeof buf, stdin) {
    const char *prefix = " A required message ";
    size_t len = strlen(prefix);
    if (!memcmp(buf, prefix, len)) {
        char c = buf[len];
        // handle correct message
    } else {
        printf("Invalid input: %s", buf);
    }
} else {
    printf("Unexpected end of file\n");
}
Run Code Online (Sandbox Code Playgroud)