如何解决带有验证循环的 C 菜单问题许多打印
我正在与合作伙伴(我们是拼贴学生)一起制作菜单,但无法解决在满足某些条件时循环打印菜单次数超过所需次数的错误。 当我想将负数输入到我用“(短)输入
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
char main() {
char choice;
printf("what would you like to do? use number keys to make a choice.\n");
printf("Database System Menu:\n1. Add person\n2. Search a person\n3. Search Parents\n4. Delete a person\n5. Get generation\n6. Print database\n7. Search by name\n8. Quit\n");
scanf("%c",&choice);
while ((short)choice<1 || (short)choice>8) {
printf("elegal coice use 1 through 8 keys.\n");
scanf("%c",&choice);
}
if ((short)choice >= 1&&(short)choice < 8) {
return choice;
}
else return '\0';
}
我们尝试过的选项 2:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char input = '0';
while (input != '8')
{
printf("Database System Menu:\n");
printf("1. Add person\n");
printf("2. Search a person\n");
printf("3. Search Parents\n");
printf("4. Delete a person\n");
printf("5. Get generation\n");
printf("6. Print database \n");
printf("7. Search by name\n");
printf("8. Quit\n");
scanf("%c",&input);
if ((short)input < 1 || input >'8')
{
printf("Invalid input\n");
}
}
}
解决方法
如您所知,%c
说明符只从标准输入中获取一个字符,但是当您输入一个字符时,您按 Enter
会导致将换行符添加到输入缓冲区,所以 stdin
中有两个字符,循环运行两次,第二次是由换行符引起的。
方法 1:
要丢弃 \n
等空白字符,只需在说明符前加一个空格,即 将 scanf("%c",&input);
替换为 scanf(" %c",&input);
,注意 %c
说明符之前的空格。仍然存在的问题是,循环将循环与输入缓冲区中的字符一样多例如,如果您输入 asdf
,循环仍将循环四次次而不是一次。
负数问题与上面有关,一个负数输入至少需要2个字符,所以问题就在这里,对于-9
的输入,循环将运行3次,对于\n
,循环将运行2次2 个字符,第三次是 \n
(如果您尚未解决 int c;
while(( c = getchar()) != '\n' && c != EOF){}
问题)。
方法 2:(更好)
要丢弃 stdin 中的所有字符,您可以使用以下内容:
scanf
在 \n
之后。
使用第二种方法,您不仅可以解决 8asds
问题,还可以丢弃您输入的任何额外字符,例如假设您输入了 {{1 }},8
将被解析,但所有其他字符将被丢弃,避免不必要的额外循环。
注意,更健壮的方法是使用fgets
来解析输入字符串,如果需要将其转换为数值,请使用strtoll
,不要使用{ {1}} 这是一个不安全的函数。
atoi
看起来像是打字错误,您可能指的是 input < 1
。
-
当你像
(short)input
那样执行转换时,它不会保留位表示,而是将其转换为新类型。一个char c = 255
被转换为一个有符号的 8 位整数不会变成一个有符号整数 -1 ,但仍然是 255。为了保持位表示,你可以尝试一些像int8_t i = -*(int8_t*)&c;
这样的方法。此外,short
是 2 个字节。 -
比较小于 1 的值似乎很奇怪。 “1”应该是 49。也许看看 ASCII Table。
-
循环可能是由于输入过多或换行符造成的。请记住,
%c
一次仅消耗 1 个字符,包括换行符。因此,如果您的输入是“-1”,它首先扫描'-'
,再次进入循环,然后扫描“1”。更改为scanf(" %c",input);
以删除任何空格(空格、制表符或\n
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。