我想创建一个菜单。我将输入一个字符,并根据什么字符的一些文本将被打印。对我来说,问题在于下面代码中的默认选项。我希望它能识别所有不是1,2,3或q的东西。不仅仅是字符,还有字符串。如果输入是“sf<ssad”,我不希望它打印“Invalid input”7次,只打印一次。另外,如果我输入“qf<<dsc”,即使第一个字符是有效的,我也想把整个输入算作无效的,因为它不止一个字符。类似地,像“1 sd <j”这样的输入不应该打印结果“hello”。相反,它应该将其打印为“Invalid input”。
我想要一个可靠的代码,最好不包括scanf,是容易的眼睛。我尝试了以下操作:
#include <stdio.h>
int main(void) {
char cmd;
do {
printf("Enter 1 to print hello, enter 2 to print world, enter 3 to print hello world and enter q to quit\n");
printf("Enter: ");
scanf(" %c", &cmd);
switch(cmd) {
case '1' : printf("hello\n"); break;
case '2' : printf("world\n"); break;
case '3' : printf("hello world\n"); break;
case 'q' : printf("Exiting...\n"); break;
default : printf("Invalid input!\n"); break;
}
} while(cmd!='q');
return 0;
}
这是不够的,因为如果我输入“sf<ssad”,“Invalid input”将被打印7次。我尝试了其他版本,但他们有类似的问题。我的一个想法是使用fgets,然后取第一个字符,然后使用atoi,尽管我不确定它会是什么样子。先谢谢你了。
2条答案
按热度按时间m3eecexj1#
调用
fgets()
,检查错误,然后将cmd
设置为该行的第一个字符。那么代码的其余部分是相同的。kq4fsx7k2#
如果输入是“sf<ssad”,我不希望它打印“Invalid input”7次,只打印一次。
在这种情况下,您应该一次读取整行输入,而不是一次读取一个字符。为此,我建议您使用函数
fgets
而不是scanf
。下面是一个例子:
此程序具有以下行为: