c - 如何用 16 位整数初始化 C 字符串?

标签 c string initialization

我想在 C 中创建一个全局的 22 个字符(+ NULL)字符串。我是这样初始化它的:

#define SVN_REVISION     "1143"
#define SERIAL_NUMBER    "PST3201109270001"
char general_info[23] = SVN_REVISION SERIAL_NUMBER SAMPLING_FREQUENCY;

到目前为止,一切正常。 general_info 是用两个字符串的连接初始化的。现在,对于最后两个字符,我希望它们是一个 16 位整数。但我不能简单地这样做:

#define SVN_REVISION          "1143"
#define SERIAL_NUMBER         "PST3201109270001"
#define SAMPLING_FREQUENCY    (UINT16)500
char general_info[23] = SVN_REVISION SERIAL_NUMBER SAMPLING_FREQUENCY SAMPLING_FREQUENCY;

我能做什么?

最佳答案

如果您想在字符串末尾嵌入 16 位整数 500 作为二进制数据,您可以使用原始十六进制字节:

/* Little-endian unsigned 16-bit integer with the value 500 */
#define SAMPLING_FREQUENCY    "\xf4\x01"

但是请注意,字节顺序取决于体系结构,因此您可能希望添加一个额外的宏以根据体系结构正确排序字节:

#ifdef ... /* little endian */
#define BYTES2(a,b) b a
#else ... /* big endian */
#define BYTES2(a,b) a b
#endif
#define SAMPLING_FREQUENCY    BYTES16("x01", "\xf4")

编辑:如果你想要一个人类可读的数字,你不能在编译时拥有它(至少在 C 中不能),但你可以在运行时初始化它:

#define SVN_REVISION     "1143"
#define SERIAL_NUMBER    "PST3201109270001"
#pragma pack(push, 1)
union {
    struct {
        char svn_rev_serial[20];
        uint16_t freq;
        char nul;
    };
    char general_info[23];
} u = {{
    SVN_REVISION SERIAL_NUMBER,
    500,
    '\0'
}};
#pragma pack(pop)

这使用了更多非标准(但得到很好支持)的构造,例如 #pragma pack 和写入一个 union 成员并从另一个成员读取。

关于c - 如何用 16 位整数初始化 C 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7582811/

相关文章:

C89 - 使用灵活的字符数组和原型(prototype)初始化结构

c - 使用 fgets 和 strtok 并尝试打印创建的节点时出现 NULL 节点或空格

C++ fwrite() 写的比预期的多

c++ - 该算法最坏情况下的运行时间是多少?

C# - 生成 10 个字符的随机字母数字字符串的最有效方法是什么?

ios - 更新到 Xcode 6.1 后 "Use of property ' nibName ' in base object before super.init initializes it"

for-loop - Golang File Reader范围错误

将(未排序的数组转换为c中的二叉搜索树

c - 多进程操作系统中的垃圾值

python - 将值赋给与 Python 中变量名相同的字符串