【问题标题】:Enum usage with switch-case in C枚举在 C 中与 switch-case 一起使用
【发布时间】:2021-12-17 03:43:05
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

enum gender {male, female};

int main () {

enum gender choice;

printf("Your gender: ");
scanf("%u", &choice);

switch(choice)
{
    case male: printf("You're a man."); break;
    case female: printf("You're a woman."); break;
    default: printf("Try again.");
}

return 0;
}

我给控制台写什么并不重要,它向我展示了“男性”案例,“你是一个男人。”。我试过用引号和单引号写案例,但它不起作用。你能帮助我吗?这是我在这里的第一个问题,如果我有任何错误,也请原谅我的英语。

【问题讨论】:

  • scanf("%u", &amp;choice); ==> if (scanf("%u", &amp;choice) != 1) { fprintf(stderr, "unable to scanf.\n"); exit(EXIT_FAILURE); }
  • malefemale 是符号,一旦程序编译运行,它们就不再存在,就像变量名不再存在一样。尝试输入01 而不是malefemale
  • 您输入的输入示例是什么? scanf() 调用的返回值是多少?请注意,"%u" 说明符表示无符号整数值,scanf() 永远不会解释枚举标识符。
  • @FredLarson 他正在输入malefemale
  • @FredLarson 我使用了“%u”,因为它不适用于“%s”和“%d”。我在这里搜索了我的问题,他们说我使用“%u”。我应该用什么来代替“%u”?

标签: c enums switch-statement scanf


【解决方案1】:

来自 C 标准(6.7.2.2 枚举说明符)

4 每个枚举类型都应兼容char,一个有符号整数 类型,或无符号整数类型。类型的选择是 实现定义,128),但应能够表示 枚举所有成员的值。

这意味着枚举类型的对象在内部不必存储为 int 或 unsigned int 类型的对象。它可以在内部存储为 char 类型的对象。

所以这个 scanf 调用

scanf("%u", &choice);

调用未定义的行为。

您需要使用 unsigned int 类型的中间变量,并在使用此变量调用 scanf 后将其整数值分配给对象选择。

另一种方法是,例如声明一个 char 类型的对象,并要求用户输入“m”代表男性或“f”代表女性,然后您可以将其转换为值 0 或 1。

例如

char c = 0;
scanf( "%c", &c );

if ( c == 'm' ) c = 0;
else if ( c == 'f' ) c = 1;
else c = 2;

choice = c;

【讨论】:

  • 我明白了,非常感谢。
猜你喜欢
  • 2022-06-10
  • 1970-01-01
  • 2019-02-16
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2012-04-30
  • 1970-01-01
相关资源
最近更新 更多