0

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

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

4 回答 4

6

In C++, you ought to use std::string for strings instead of char arrays, and std::stringstream and its cousins std::istringstream and std::ostringstream instead of sprintf() or snprintf() for formatting in string buffers. Here’s the basis of a C++ solution:

std::ostringstream result;
for (int i = 0; i < cnt; ++i) {
    result << "...\n";
}
result << "end\n";
return result.str();

The std::string class handles all of the details of managing memory, and std::stringstream uses std::string internally.

于 2012-09-06T21:29:28.400 回答
3

std::stringstream再加上operator <<作品就像一个魅力。

于 2012-09-06T21:25:42.343 回答
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;
于 2012-09-07T00:46:49.847 回答
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++ 中也是如此。

于 2012-09-06T22:07:59.763 回答