我可以将sprintf()与多个#define标记字符串一起使用

时间:2013-04-26 19:23:48

标签: c printf c-preprocessor

我有两个字符串可能会独立更改。我想让它们#defines,所以我不必在代码中改变它。我在将问题与sprintf()放在一起时遇到了问题。

所以,下面,如果VoltageSet是2.2,我想把字符串“sour:volt:2.2 \ r \ n”放入cmd缓冲区。

(FYI-SOUR:VOLT:2.2是对乐器的SCPI命令,\ r \ n是回车以终止消息)

在我的标题中:

#define SETVOLTAGELEVEL "SOUR:VOLT:"
#define TERMINATIONCHAR "\r"

在我的c代码中:

int SetVoltageLevel (double VoltageSet)
{
    char cmd[255]={0};
    sprintf(cmd, "SETVOLTAGELEVEL%fTERMINATIONCHAR", VoltageSet);
}

我在想这个吗?有没有更简单的方法?

4 个答案:

答案 0 :(得分:2)

sprintf(cmd, SETVOLTAGELEVEL "%f" TERMINATIONCHAR, VoltageSet);

sprintf(cmd,  "%s%f%s", SETVOLTAGELEVEL, VoltageSet, TERMINATIONCHAR);

答案 1 :(得分:1)

我不太了解你希望通过这种行为(An XY problem?)实现这一目标,但你可以通过一个接一个地编写字符串文字来连接它们:

sprintf(cmd, SETVOLTAGELEVEL "%f" TERMINATIONCHAR, VoltageSet);

<强>可是...

  1. <强> 为什么?

  2. 风险很大。您不仅无法使用snprintf()而不是sprintf(),但如果两个宏定义的格式说明符多于或少于实际为函数提供参数,则可能会遇到格式字符串错误。

答案 2 :(得分:0)

这里没有错。在编译之前,预处理器即define将被其值替换。所以你不会看到任何不同。

答案 3 :(得分:0)

@BLUEPIXY指出了一种方法。这是一个更接近你的想法。请注意,您所拥有的内容不起作用,因为预处理器不会在字符串内扩展标记。但是你可以使用字符串连接。很高兴知道。

int SetVoltageLevel (double VoltageSet)
{
    char cmd[255]={0};
    sprintf(cmd, SETVOLTAGELEVEL "%f" TERMINATIONCHAR, VoltageSet);
}