如何在值为零时不打印整数?

时间:2013-12-16 05:21:18

标签: 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, "%s,%s,%s,%d \n", s1.c_str(), s2.c_str(), s3.c_str(), x);

3 个答案:

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