Краткий ответ:
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)"
.
выводится пустая строка.