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

时间:2011-09-28 11:52:06

标签: 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;

我该怎么办?

4 个答案:

答案 0 :(得分:1)

你必须使用通常的“stringify operator”技巧。

#define STRINGIFY_HELPER(str) #str
#define STRINGIFY(str) STRINGIFY_HELPER(str)

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

您需要双宏来利用预处理器#运算符,因为在使用#运算符时不会展开宏参数。因此,首先扩展参数需要额外的宏步骤,然后使用#运算符。可以找到一个很好的解释here


<强> 修改

实际上,由于(UINT16)强制转换,这将无效,因此也会进行字符串化。只有当你能负担得起额外的宏时,你仍然可以使用宏:

#define STRINGIFY_HELPER(str) #str
#define STRINGIFY(str) STRINGIFY_HELPER(str)

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

它不是很优雅,但你仍然可以避免重复500值的问题(你只需要在一个地方更新它,一切都会正常工作)。

答案 1 :(得分:1)

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

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

请注意,endianness依赖于体系结构,因此您可能需要添加一个额外的宏来根据体系结构正确排序字节:

#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中)拥有它,但你可以在运行时初始化它: / p>

#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,并写入一个联盟成员并从另一个联盟成员阅读。

答案 2 :(得分:0)

嗯,你可以试试这个:

char general_info[23] = SVN_REVISION SERIAL_NUMBER SAMPLING_FREQUENCY;
strcat(genral_info, itoa(SAMPLING_FREQUENCY));

答案 3 :(得分:0)

您可以尝试以下内容:

#define SVN_REVISION          "1143"
#define SERIAL_NUMBER         "PST3201109270001"
#define SAMPLING_FREQUENCY    "\xF4\x1\00\00"
char general_info[29] = SVN_REVISION SERIAL_NUMBER SAMPLING_FREQUENCY SAMPLING_FREQUENCY;

\ xF4 \ x1 \ 00 \ 00是十进制500的内存表示形式(至少在Windows平台上)