有没有办法让下面的代码缩短?也许有一种方法只能使用一个sprintf
命令,但我不知道如何。当值为零时,我需要避免打印x
。
char msg[1000];
string s1 = "s1";
string s2 = "s2";
string s3 = "s3";
int x = 0;
if(x == 0)
sprintf(msg, "%s,%s,%s \n", s1.c_str(), s2.c_str(), s3.c_str());
else
sprintf(msg, "%s,%s,%s,%d \n", s1.c_str(), s2.c_str(), s3.c_str(), x);
答案 0 :(得分:1)
由于printf系列函数会评估但忽略任何未使用的参数,因此这将是一个选项;
sprintf(msg, x == 0 ? "%s,%s,%s \n" : "%s,%s,%s,%d \n",
s1.c_str(), s2.c_str(), s3.c_str(), x);
为了便于阅读和清晰,我个人会保留您当前的版本。直到真正被证明是一个问题,可读性在任何一天都胜过微优化。
答案 1 :(得分:1)
由于您使用的是C ++,为什么不使用stringstream
来构建缓冲区:
#include <cstdio>
#include <sstream>
#include <string>
using namespace std;
int main() {
string s1 = "s1";
string s2 = "s2";
string s3 = "s3";
int x = 0;
stringstream ss;
ss << s1 << "," << s2 << "," << s3;
if (x != 0)
ss << "," << x;
ss << " " << endl;
// Don't do this! See link below
//const char* c = ss.str().c_str();
string result = ss.str();
const char* c = result.c_str();
printf("Result: '%s'\n", c);
getchar();
return 0;
}
答案 2 :(得分:0)
简单,将其分解为部分:
printf("%s,%s,%s", s1.c_str(), s2.c_str(), s3.c_str()); // no newline
if(x != 0)
printf(",%d", x);
printf(" \n");
当尝试做这样的事情时,将其视为一个数学问题:将两个语句之间的共同点分解出来,无论if
条件如何,都要这样做。
如果你想使用sprintf
(因为你改变了你的问题),你需要将指针调整到你每次传递的缓冲区中以考虑已经写入的内容。此外,您应该使用带有长度参数的snprintf
,以确保不会过度运行缓冲区。这个长度也需要在每个步骤之后进行调整。