为什么空字符串转换为“(null)”?

时间:2011-12-08 12:51:33

标签: printf string c++builder-6

我有以下代码示例:

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之前的任何时候都没有看到过这种行为。可以以某种方式避免这种行为吗?

4 个答案:

答案 0 :(得分:2)

如果您的变量prefix极有可能是NULL。试试这个:

str.printf("Voltage [%sV]", prefix == NULL ? "" : prefix);

答案 1 :(得分:2)

简答:

str.printf("Voltage [%sV]", prefix.c_str());

详细答案:

AnsiString包含一个类成员,一个名为char*的{​​{1}}指针。当字符串为空时,Data指针为DataNULL指针位于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));

希望它可以帮助某人到达这里出于同样的原因。