提问人:Player1 ready 提问时间:4/6/2023 最后编辑:anastaciuPlayer1 ready 更新时间:4/6/2023 访问量:54
使用scanf进行切换和组合,如何避免多次输入
Switch and while combination using scanf, how to avoid multiple input
问:
在这个组合中,当我按“a”或“b”时,这很好,但我不希望程序打印并且当用户输入“ab”时。switch
while
1
2
当用户输入包含多个字符的输入时,如何打印错误消息?
#include <stdio.h>
int main() {
char move;
while (move != 'd') {
printf("enter a move : ");
scanf(" %c", &move);
switch (move) {
case 'a':
printf("1\n");
break;
case 'b':
printf("2\n");
break;
case 'c':
printf("3 \n");
} // switch
} // while
}
输出示例:
enter a move : a
1
enter a move : b
2
enter a move : ab
1
enter a move : 2
当我输入“ab”、“ac”或“bc”或类似内容时,程序应该打印错误消息。
答:
1赞
anastaciu
4/6/2023
#1
我建议使用 of 来解析输入。避免常见的边缘情况变得有些棘手,您需要处理换行符,当您按下时,该换行符也将从您的输入中解析出来,您需要清除输入以准备下一个循环,因为在某些情况下,解析您还需要避免处理它,仅举一些常见情况。fgets
Enterfgets
\n
这是你如何做到的:
你可以在这里试试:https://onlinegdb.com/S6Uh3mrHX
#include <stdio.h>
#include <string.h>
int main() {
char move[20] = {};
while (move[0] != 'd') {
printf("enter a move : ");
// parse and check fgets return to validate input
if (fgets(move, sizeof move, stdin) != NULL) {
// if we have more than 2 chars, error, fgets also parses \n and strlen counts it
if (strlen(move) > 2) {
printf("Error, invalid input\n");
// if the \n character wasn't already parsed we need to handle it
if (!strchr(move, '\n')) {
int c;
// this just clears the stdin input buffer
while ((c = getchar()) != '\n' && c != EOF) {}
}
// Since we got an error, let's reset our target buffer
move[0] = 0;
}
}
switch (move[0]) {
case 'a':
printf("1\n");
break;
case 'b':
printf("2\n");
break;
case 'c':
printf("3 \n");
} // switch
} // while
}
但是,如果您必须使用 ,这里有一个可能的解决方案:scanf
你可以在这里试试:https://onlinegdb.com/Hcu8dlb04G
#include <stdio.h>
int main() {
char move = 0; // don't forget to initialize, accessing an unitialized
// variable is UB (1
while (move != 'd') {
printf("enter a move : ");
if (scanf(" %c", &move) == 1) {
int c;
if (getchar() != '\n') { // if more character were inputed other than newline
printf("Error, invalid input\n"); // print error
while ((c = getchar()) != '\n' && c != EOF) {} // clear input buffer
move = 0; // reset target variable
}
switch (move) {
case 'a':
printf("1\n");
break;
case 'b':
printf("2\n");
break;
case 'c':
printf("3 \n");
} // switch
} // while
}
}
您可能仍然需要处理其他边缘情况,例如,假设用户输入,没有发出输入错误,它只是跳转到下一个输入循环(您可以在 中处理),您可能还想添加对大写字母的支持。j
switch
1 - UB:未定义的行为,定义:https://port70.net/%7Ensz/c/c11/n1570.html#3.4.3
评论
scanf
fgets