如何在构建C ++字符串时处理未终止的字符数组?

时间:2011-05-02 05:52:37

标签: c++

What is the C++ idiom to replace snprintf(3)?中所述,如果标头中的某个四字节字段损坏,我正在解析文件头并构建错误消息。这段代码总结了我正在尝试做的事情:

const std::string parseCapturePattern(const int fd) { // fd is the descriptor of the ogg file
  const char CAPTURE_PATTERN[4] = {'O', 'g', 'g', 'S'};
  char capture_pattern[4];

  read(fd, capture_pattern, sizeof(capture_pattern)); // error handling omitted
  if (strncmp(capture_pattern, CAPTURE_PATTERN, sizeof(capture_pattern)) != 0) {
    std::ostringstream err;
    /*** This won't actually work ***/
    err_msg << "Invalid capture pattern: '" << capture_pattern << "'; expecting '"
        << CAPTURE_PATTERN << "'";
    /*** This won't actually work ***/

    return err.str();
  }
}

这不起作用,因为capture_patternCAPTURE_PATTERN不是以NULL结尾的字符数组。这是什么工作:

    err_msg << "Invalid capture pattern: '" << capture_pattern[0] << capture_pattern[1] 
        << capture_pattern[2] << capture_pattern[3] << "'; expecting '"
        << CAPTURE_PATTERN[0] << CAPTURE_PATTERN[1] << CAPTURE_PATTERN[2]
        << CAPTURE_PATTERN[3] << "'";

当然,这几乎是难以形容的可怕。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

std::string(capture_pattern, capture_pattern+4)将从capture_pattern的4个第一个字符构造一个字符串。

答案 1 :(得分:0)

一些想法:

使用空终止字符串,并使用字符串查找功能: const char CAPTURE_PATTERN [] =“OggS”;

然后,您可以在空终止字符串上使用strstr。如果您不想在末尾添加空字符,这当然是个问题,但如果您想使用strstr()

一次搜索大量数据,这可能是有益的。

另一个想法是使用memcmp()。与字符串比较类似,但直接适用于您传递的内容。您不需要空终止,并且仍然可以使用const char CAPTURE_PATTERN [] =“OggS”初始化您的字符串;