你能帮我在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 ++的新手。
感谢您的帮助。
答案 0 :(得分:6)
在C ++中,您应该使用std::string
代替char
数组,而std::stringstream
及其堂兄std::istringstream
和std::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;