在循环中连接Visual Studio C ++ 6.0中的字符串

时间:2012-09-06 21:24:47

标签: c++ string concatenation

你能帮我在Visual Studio C ++ 6.0的C ++中优化这段代码:

char output[10000] = "";
for (int i = 0; i < cnt; i++) {
    char row[150];
    _snprintf(row, 149, "…", …);
    row[149] = '\0';
    strcat(output, row);
}
return _snprintf(buffer, size-1, "%s\r\nend\r\n", output);

我需要的是我没有指定output []的大小,而是动态地增加它。对于row []也是如此。对不起,我是C ++的新手。

感谢您的帮助。

4 个答案:

答案 0 :(得分:6)

在C ++中,您应该使用std::string代替char数组,而std::stringstream及其堂兄std::istringstreamstd::ostringstream代替{{} 1}}或sprintf()用于格式化字符串缓冲区。这是C ++解决方案的基础:

snprintf()

std::ostringstream result; for (int i = 0; i < cnt; ++i) { result << "...\n"; } result << "end\n"; return result.str(); 类处理内存管理的所有细节,std::string内部使用std::stringstream

答案 1 :(得分:3)

std::stringstream加上operator <<就像魅力一样。

答案 2 :(得分:0)

我认为作为答案给出的C ++容器的使用并不像你能得到的那样优化。开始时没有保留内存,结果不会像提供的代码那样复制到buffer

你仍然可以做得更好:

char suffix[] = "\r\nend\r\n";
int suffix_len = strlen(suffix);
char *buf_end = buffer + size - suffix_len - 1;
char *buf_begin = buffer;

for (int i = 0; i < cnt; i++) {
    int nchars = _snprintf(buf_begin, buf_end-buf_begin, "…", …);
    if( nchars >= 0 ) {
        buf_begin += nchars;
    } else {
        // You may want to set an overflow flag here.
        buf_begin = buf_end;
        break;
    }
}

// There will always be enough room in the buffer to store the suffix, so 
// this will null-terminate even if the above loop overflowed the buffer.
_sprintf(buf_begin, "%s", suffix);

我已将其修改为直接写入buffer而不是output。它利用_sprintf族返回写入的字符数(如果写入最大字符则为负数)这一事实。对我来说,这是将数据连接到缓冲区的首选方法,即使在C ++中也是如此。

答案 3 :(得分:0)

如果您使用MFC,使用CString类非常容易:

// loop count
int nCount = 100;
CString strOutput, strOne;
for (int i=0 ; i<nCount ; i++)
{   // format one line
    strOne.Format(_T("..."), ...);
    // accumulate the result
    strOutput += strOne;
}
return strOutput;