C++ 当整数的值为零时,如何不打印整数?

C++ 当整数的值为零时,如何不打印整数?,c++,printf,C++,Printf,有没有办法缩短下面的代码?也许有一种方法可以只使用一个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, "%

有没有办法缩短下面的代码?也许有一种方法可以只使用一个
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);

简单地说,把它分成几个部分:

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
,它接受一个长度参数,以确保不会过度运行缓冲区。这一长度也需要在每一步之后进行调整。

由于printf函数族会求值,但会忽略任何未使用的参数,因此这将是一个选项

sprintf(msg, x == 0 ? "%s,%s,%s \n" : "%s,%s,%s,%d \n", 
          s1.c_str(), s2.c_str(), s3.c_str(), x);

为了可读性和清晰性,我个人会保留您当前的版本。直到真正被证明是一个问题,可读性胜过任何一天的微细优化。

< P>因为你使用C++,为什么不使用构建块的缓冲:

#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;
}
#包括
#包括
#包括
使用名称空间std;
int main(){
字符串s1=“s1”;
字符串s2=“s2”;
字符串s3=“s3”;
int x=0;
细流ss;

ss@Meysam你真的想把这个
sprintf
'd放到一个缓冲区吗?还是它会在
stdout
结束呢?我需要把
msg
传递给一个需要
char*
作为参数的函数。这两个代码中都有一个分支。你的分支可能不是一个优化。@MatthewLundberg是的,这取决于编译器,就像mos一样非算法优化确实如此。使用gcc进行快速测试似乎可以节省一些代码大小,而不是速度,因为c_str只被称为I3位而不是6位,但这当然不一定是真的。由于解决方案的性能对我来说也很重要,您知道使用
stringstream
是否比
sprintf
效率更低或更高>?性能总是很重要。问题是,它是最重要的吗?我现在不知道答案,也不担心。用清晰、简洁的方式编写代码,然后进行优化。过早优化是万恶之源。感谢您的努力和优雅的解决方案!除了……它不会ork。仍在弄清楚原因。它必须是
const char*c