1

I have following code sample:

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

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

Pretty simple isn't it? String str is used as description for numeric values displayed in graph. For value say 0.05 V it is much more comprehensive and intuitive to say instead that "voltage is 50 mV". This is ensured through using proper prefix in this case "m". For values range <1; 1000) there is no need to add any prefix. We can for example say "voltage over this element is 50 volts" and this is perfectly understandable. I have problem that library function printf keeps adding string "(null)" when prefix is empty string for example:

"Voltage [(null)V]"

I haven't seen this type of behaviour anytime before when using Microsoft Visual Studio. Can this behaviour be somehow avoided?

4

4 に答える 4

2

あなたの変数prefixがである可能性が非常に高い場合NULL。これを試して:

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ポインターは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()受け取りません。NULL文字列が空の場合、長さ 0 の null で終わる文字列へのポインターを受け取るため、代わりに空白の文字列を出力します"(null)"

于 2011-12-08T21:57:46.723 に答える
0

Joachimの回答を使用して、次のマクロを作成しました(Cを使用):

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

そして、私はそれを次のように使用できます:

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

うまくいけば、誰かが同じ理由でここに到達するのに役立ちます.

于 2015-03-06T16:28:13.647 に答える
0

私は次の構造でこれを行うことができました:

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

しかし、私は違いが何であるかを理解していません。

于 2011-12-08T13:02:01.313 に答える