0

我有两个可能独立变化的字符串。我想制作它们#defines,这样我就不必在我的代码中全部更改它。我在将它们与sprintf().

因此,下面,如果 VoltageSet 为 2.2,我想将字符串“sour:volt:2.2\r”放入 cmd 缓冲区。

(仅供参考 - SOUR:VOLT:2.2 是仪器的 SCPI 命令,\r 是用于终止消息的回车)

在我的标题中:

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

在我的 c 代码中:

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

我是不是想太多了?有没有更简单的方法?

4

4 回答 4

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

或者

sprintf(cmd,  "%s%f%s", SETVOLTAGELEVEL, VoltageSet, TERMINATIONCHAR);
于 2013-04-26T19:26:35.370 回答
1

我不太明白您想通过这种行为来实现这一点(一个 XY 问题?),但是您可以通过一个接一个地编写字符串文字来连接它们:

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

但...

  1. 为什么?

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

于 2013-04-26T19:27:15.843 回答
0

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

int SetVoltageLevel (double VoltageSet)
{
    char cmd[255]={0};
    sprintf(cmd, SETVOLTAGELEVEL "%f" TERMINATIONCHAR, VoltageSet);
}
于 2013-04-26T19:54:26.450 回答
0

这里没有错。预处理器(即定义)将在编译前被其值替换。所以你不会看到任何区别。

于 2013-04-26T19:30:43.780 回答