【问题标题】:4 byte char array to an integer to be used in `case` statement in C4字节字符数组到一个整数,用于C中的`case`语句
【发布时间】:2019-06-27 11:40:16
【问题描述】:

如何使用长度为 4 的字符数组(字符串文字)来表示 4 字节整数?

我想用一个长度为 4 的字符串文字来代替一个 4 字节的整数,这将在这个 case 语句中使用。 我想这样写:

case "\x0ATst":
    printf("FOUND TIME STAMP");
    break;

不是:

case 0x7473540A:
    printf("FOUND TIME STAMP");
    break;

因为主要代码更易于阅读。

我在 google 上搜索了“string to int”,但只找到了atoi() 这样的答案。

【问题讨论】:

  • "\x0ATst" 是一个字符数组(字符串)。字符数组不能用作大小写标签。
  • case 标签必须是整数常量表达式,因此即使在宏的帮助下也不能使用字符串文字。你能做的最好的就是X('D','A','T','A')
  • @KYHSGeekCode 不,你不能,句号。
  • @KYHSGeekCode 然后使用宏!
  • "但我想知道我是否可以让编译器自动替换" 如果这可行,它不可行,您需要确保将 sting 文字放置在地址0x7473540A,你不能。

标签: c switch-statement byte literals


【解决方案1】:

switch 仅适用于整数常量,因此它根本不是很灵活。您不能将case 与表达式、字符串或除int 之外的任何其他类型一起使用。

但在这种情况下没关系,因为你不应该有任何形式,因为它们都不是非常可读的。请改用case STAMP:,其中STAMP 是一个合适的、不言自明的名称。它可以是#defineconstenum

至于如何将 4 个字符的字符串转换为 int,你不能简单地做 *(int*)"\x0ATst" 有多种原因(对齐,严格别名)。通过使用联合,有一个解决方法:

typedef union
{
  char str[4];
  unsigned int val;
} conv_t;

...

(conv_t){.str = "\x0ATst" }.val

请注意,这段代码很大程度上依赖于 CPU 字节序,所以它仍然不是很好的做法。

【讨论】:

  • 你打算如何在case中使用它?
  • @P__J__ 你不是,你会使用整数常量STAMP。或者只是不使用 switch-case,它们既麻烦又难以阅读。 if-else 更强大,并且无论如何都可以扩展为相同的机器代码。
  • 您可以使用 constant 表达式。例如case 3+4: 就可以了。
  • @klutt 具体来说,一个整数常量表达式。但这在这种情况下没有任何帮助。
  • @Lundin 或者只是不使用 switch-case,它们很麻烦且难以阅读。 if-else 更强大 有趣的理论 - if-s 的长“波”绝对更容易阅读:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
相关资源
最近更新 更多