#define一个char数组,在C ++中没有空终止

时间:2014-12-12 15:39:05

标签: c++

我正在研究一种需要非常快速启动时间的行业安全产品。我试图遵循行业标准输出ASCII文件。为了加快这个文件格式化步骤,我使用#define' s在静态内存中创建了几个字符数组。这是一个小部分,例如:

#define COMTRADE_STATION_ID         "Station Name,Device ID,1999\r\n"
#define COMTRADE_CHANNEL_COUNT      "10,10A,0D\r\n"
#define COMTRADE_FREQUENCY          "60\r\n"
#define COMTRADE_FILE_TYPE          "BINARY\r\n1\r\n"

struct TS_ComtradeConfig
{
    const char StationID[sizeof(COMTRADE_STATION_ID)];
    const char ChannelCount[sizeof(COMTRADE_CHANNEL_COUNT)];
    char Frequency[sizeof(COMTRADE_FREQUENCY)];
    const char FileType[sizeof(COMTRADE_FILE_TYPE)];
};

TS_ComtradeConfig ConfigFile =
{
        {COMTRADE_STATION_ID},
        {COMTRADE_CHANNEL_COUNT},
        {COMTRADE_FREQUENCY},
        {COMTRADE_FILE_TYPE}
};

这是我用来打印出来的一些基本代码。

for(int nIndex = 0; nIndex < sizeof(ConfigFile); nIndex++)
{
    printf("%c", ((char*)(ConfigFile.StationID))[nIndex]);
}

这适用于生成静态char数组,并且它可以很好地打印出整个ConfigFile,但是char数组是以null结尾的,这意味着最终结果不符合行业标准。似乎#define字符串由预处理器以空值终止。有没有办法解决?或者用于进行这种高速操作的任何其他方法?

2 个答案:

答案 0 :(得分:3)

字符串连接怎么样:

#define COMTRADE_STATION_ID         "Station Name,Device ID,1999\r\n"
#define COMTRADE_CHANNEL_COUNT      "10,10A,0D\r\n"
#define COMTRADE_FREQUENCY          "60\r\n"
#define COMTRADE_FILE_TYPE          "BINARY\r\n1\r\n"

#define COMTRADE_ALL COMTRADE_STATION_ID COMTRADE_CHANNEL_COUNT COMTRADE_FREQUENCY COMTRADE_FILE_TYPE

    // no struct, plain char array, no intervening nulls (but a trailing one)
char[sizeof(COMTRADE_ALL)] comTradeAll = COMTRADE_ALL; 

答案 1 :(得分:2)

for(int nIndex = 0; nIndex < sizeof(ConfigFile); nIndex++)
{
    printf("%c", ((char*)(ConfigFile.StationID))[nIndex]);
} 

我不知道您为什么要像char char那样将其打印出来。如果该结构中存在填充,则表示您遇到了麻烦。

为什么不直接遍历ConfigFilefwrite成员呢?用以下代码替换整个循环:

// Add a -1 to the size to skip the \0
fwrite(ConfigFile.StationID, sizeof(ConfigFile.StationID) - 1, 1, stdout);
fwrite(ConfigFile.ChannelCount, sizeof(ConfigFile.ChannelCount) - 1, 1, stdout);
fwrite(ConfigFile.Frequency, sizeof(ConfigFile.Frequency) - 1, 1, stdout);
fwrite(ConfigFile.FileType, sizeof(ConfigFile.FileType) - , 1, stdout);

不仅代码更清晰(因为你没有做你奇怪的char指针黑客攻击),它会打印出你想要的东西。它也可能稍微更有效率,因为您没有要处理的格式化字符串(它只是进行数据转储)。