如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_pattern
和CAPTURE_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] << "'";
当然,这几乎是难以形容的可怕。
有什么想法吗?
答案 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”初始化您的字符串;