2011-05-02 38 views
1

What is the C++ idiom to replace snprintf(3)?所述,如果標頭中的某個四字節字段損壞,我正在解析文件頭並生成錯誤消息。此代碼總結了我想要做的事:如何在構建C++字符串時處理未終止的字符數組?

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是不是空終止字符數組。這是什麼工作:

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] << "'"; 

這當然,幾乎是無法形容的可怕。

任何想法?

回答

4

std::string(capture_pattern, capture_pattern+4)將從capture_pattern的4個第一個字符構造一個字符串。

+2

完美!如果C++很容易,誰需要Ruby? ;) – 2011-05-02 06:02:15

0

一對夫婦的想法:

既可以使用一個空終止字符串,並使用一個字符串查找函數: 常量字符CAPTURE_PATTERN [] = 「OggS」;

然後,您可以使用空終止字符串上的strstr。如果你不想在結尾添加一個空字符,這當然是一個問題,但如果你想用strstr()搜索一大塊數據,這可能是有益的()

另一個想法是使用memcmp()。與字符串比較類似,但直接針對您傳遞的內容進行操作。你不需要空終止,並且仍然可以用const char CAPTURE_PATTERN [] =「OggS」初始化你的字符串;

+0

好主意,但如果可能的話,我想用慣用的C++做 - 在C++中使用C標準庫有時是必需的,但我認爲應該使用面嚮對象語言(或標準庫,這種情況下)儘可能提供。如果沒有其他,它使單元測試更容易。 :) – 2011-05-03 14:54:48