微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有验证循环的 C 菜单问题许多打印

如何解决带有验证循环的 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 举报,一经查实,本站将立刻删除。