有没有办法在 scanf() 函数中强制输入 space ?
Is there a way to make space input obligatory in the scanf() function?
例如,我想让用户在值之前键入一条必需的消息,如下所示:
scanf(" Message%c", &character);
没关系,但我希望此消息包含一些空格,如下所示:
scanf(" A required message %c", &character);
编译器没有报错,但空格无所谓,输入:
A required message C
和
ArequiredmessageC
给出相同的结果。
有没有办法强制这些空格?
您可以显式匹配一个 space:
scanf("%*1[ ]A%*1[ ]required%*1[ ]message%*1[ ]%c", &character);
您可以使用带有 1
长度修饰符和 *
的 %[
转换说明符来抑制赋值:
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
}
这非常繁琐且难以阅读。您可以使用 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");
}
例如,我想让用户在值之前键入一条必需的消息,如下所示:
scanf(" Message%c", &character);
没关系,但我希望此消息包含一些空格,如下所示:
scanf(" A required message %c", &character);
编译器没有报错,但空格无所谓,输入:
A required message C
和
ArequiredmessageC
给出相同的结果。
有没有办法强制这些空格?
您可以显式匹配一个 space:
scanf("%*1[ ]A%*1[ ]required%*1[ ]message%*1[ ]%c", &character);
您可以使用带有 1
长度修饰符和 *
的 %[
转换说明符来抑制赋值:
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
}
这非常繁琐且难以阅读。您可以使用 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");
}