Почему пустая строка преобразуется в "(null)"? - PullRequest
1 голос
/ 08 декабря 2011

У меня следующий пример кода:

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 В гораздо понятнее и понятнее сказать, что «напряжение составляет 50 мВ».Это обеспечивается с помощью правильного префикса в данном случае «m».Для диапазона значений <1;1000) нет необходимости добавлять префикс.Например, можно сказать, что «напряжение на этом элементе составляет 50 вольт», и это вполне понятно.У меня проблема в том, что библиотечная функция printf продолжает добавлять строку "(null)", когда префикс является пустой строкой, например: </p>

"Voltage [(null) V]"

Я не видел этоготип поведения в любое время раньше при использовании Microsoft Visual Studio.Можно ли как-то избежать этого поведения?

Ответы [ 4 ]

2 голосов
/ 09 декабря 2011

Краткий ответ:

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 в этой ситуации. Если строка пуста, она получает указатель на строку с нулевым символом в конце, поэтому вместо "(null)".

выводится пустая строка.
2 голосов
/ 08 декабря 2011

Если очень вероятно, что ваша переменная prefix равна NULL.Попробуйте это:

str.printf("Voltage [%sV]", prefix == NULL ? "" : prefix);
0 голосов
/ 06 марта 2015

Используя ответ Иоахима, я создал следующий макрос (используя C):

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

И я могу использовать его так:

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

Надеюсь, это кому-нибудь поможетдобираться сюда по той же причине.

0 голосов
/ 08 декабря 2011

Мне удалось сделать это с помощью следующей конструкции:

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

Но я не понимаю, в чем разница.

...