1

我有以下代码示例:

double t_values[FFT_SIZE];
AnsiString prefix;
double multiplier;
AutoScaleData(t_values, FFT_SIZE, prefix, multiplier);

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

很简单不是吗?字符串str用作图形中显示的数值的描述。对于 0.05 V 的值,说“电压为 50 mV”更为全面和直观。这是通过在这种情况下使用适当的前缀“m”来确保的。对于值范围 <1;1000) 不需要添加任何前缀。例如,我们可以说“这个元件上的电压是 50 伏”,这是完全可以理解的。当前缀为空字符串时,我遇到库函数 printf 不断添加字符串“(null)”的问题,例如:

“电压 [(null)V]”

在使用 Microsoft Visual Studio 之前,我从未见过这种行为。可以以某种方式避免这种行为吗?

4

4 回答 4

2

如果你的变量很可能prefixNULL. 试试这个:

str.printf("Voltage [%sV]", prefix == NULL ? "" : prefix);
于 2011-12-08T12:55:25.057 回答
2

简短的回答:

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

详细答案:

AnsiString包含一个类成员,一个char*名为Data. 当字符串为空时,Data指针为NULLData指针位于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()都不会收到NULL指针。如果字符串为空,它会接收一个指向 0 长度以 null 结尾的字符串的指针,因此它会输出一个空白字符串而不是"(null)".

于 2011-12-08T21:57:46.723 回答
0

我设法通过以下构造做到了这一点:

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

但我不明白有什么区别。

于 2011-12-08T13:02:01.313 回答
0

使用 Joachim 的回答,我创建了以下宏(使用 C):

#define ISNULLSTR(x) (x == NULL ? "" : x)

我可以像这样使用它:

printf("%s", ISNULLSTR(possible_null_text));

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

于 2015-03-06T16:28:13.647 回答