我有以下代码示例:
double t_values[FFT_SIZE];
AnsiString prefix;
double multiplier;
AutoScaleData(t_values, FFT_SIZE, prefix, multiplier);
AnsiString str;
str.printf("Voltage [%sV]", prefix);
很简单不是吗? String str 用作图表中显示的数值的描述。对于值为0.05 V,它更加全面和直观地说“电压为50 mV”。通过在这种情况下使用适当的前缀“m”来确保这一点。对于值范围<1; 1000)不需要添加任何前缀。例如,我们可以说“这个元件上的电压是50伏”,这是完全可以理解的。我有问题,当前缀为空字符串时,库函数printf不断添加字符串“(null)”,例如:
“电压[(null)V]”
我在使用Microsoft Visual Studio之前的任何时候都没有看到过这种行为。可以以某种方式避免这种行为吗?
答案 0 :(得分:2)
如果您的变量prefix
极有可能是NULL
。试试这个:
str.printf("Voltage [%sV]", prefix == NULL ? "" : prefix);
答案 1 :(得分:2)
str.printf("Voltage [%sV]", prefix.c_str());
AnsiString
包含一个类成员,一个名为char*
的{{1}}指针。当字符串为空时,Data
指针为Data
。 NULL
指针位于Data
实例的起始内存地址。
调用AnsiString
时,其printf()
说明符期望您传入%s
指针,但您正在传入char*
实例。这实际上与直接传递AnsiString
内部printf()
指针相同。换句话说,这句话:
AnsiString::Data
实际上就像你做的那样:
str.printf("Voltage [%sV]", prefix);
这就是str.printf("Voltage [%sV]", prefix.data());
输出printf()
的原因。您正在向它传递"(null)"
指针以开始。
NULL
方法永远不会返回AnsiString::c_str()
指针。如果字符串不为空,NULL
按原样返回c_str()
指针。否则,它会返回指向静态AnsiString::Data
字符的指针。无论哪种方式,'\0'
在这种情况下都不会收到printf()
指针。如果字符串为空,则它接收指向0长度以空字符结尾的字符串的指针,因此它输出一个空字符串而不是NULL
。
答案 2 :(得分:0)
我设法通过以下构造来实现这一目标:
str.printf("Voltage [%sV]", prefix.c_str());
但我不明白有什么区别。
答案 3 :(得分:0)
使用Joachim的答案,我创建了以下宏(使用C):
#define ISNULLSTR(x) (x == NULL ? "" : x)
我可以像以下一样使用它:
printf("%s", ISNULLSTR(possible_null_text));
希望它可以帮助某人到达这里出于同样的原因。