Как напечатать не ASCIIZ строку, если известна её длина? Печать
Добавил(а) microsin   

Для печати строки, которая не завершается нулевым символом (не ASCIIZ), но известна её длина, есть несколько способов в зависимости от контекста.

1. Вывод строк с помощью printf, используя формат "%.*s" с указанием точной длины:

printf("%.*s", length, string_ptr);

Например:

char buffer[100] = "Hello World"; // Нет гарантии нулевого символа
int len = 5; // Хотим напечатать только "Hello"
printf("%.*s\n", len, buffer); // Напечатает "Hello"

В ESP-IDF можно использовать ESP_LOGI с таким же форматом:

ESP_LOGI(TAG, "%.*s", length, string_ptr);

2. Создание временной строки на стеке (общий случай, C/C++)

void print_non_asciiz(const char* str, size_t len) {
char buffer[256]; // Достаточно большой буфер
if (len < sizeof(buffer)) {
memcpy(buffer, str, len);
buffer[len] = '\0';
printf("%s", buffer);
}
else {
// Печатать по частям
for (size_t i = 0; i < len; i += 50) {
size_t chunk = (len - i < 50) ? len - i : 50;
printf("%.*s", (int)chunk, str + i);
}
} }

3. Использование fwrite для прямого вывода

fwrite(string_ptr, 1, length, stdout);
fputc('\n', stdout); // Добавить перевод строки если нужно

4. Использование write (POSIX)

write(STDOUT_FILENO, string_ptr, length);
write(STDOUT_FILENO, "\n", 1);

5. Печать по одному символу с ограничением длины

Если строка может быть очень длинной или не содержать нулевой символ:

void safe_print(const char* str, size_t max_len) {
// Печатаем не более max_len символов, но останавливаемся на нулевом символе
size_t printed = 0;
while (printed < max_len && *str) {
putchar(*str++);
printed++;
}
putchar('\n'); }

// Использование safe_print(string_ptr, known_length);

[Вывод не ASCIIZ-строк на языке C++]

6. Использование std::string_view (C++17)

#include < string_view>

void print_string(const char* str, size_t len) {
std::string_view sv(str, len);
std::cout << sv << std::endl; }

7. Использование std::string

std::string s(string_ptr, length);
std::cout << s << std::endl;
// или printf("%s", std::string(string_ptr, length).c_str());

[Ссылки]

1. Секреты printf.
2. Проблемы с printf и sprintf.
3. IAR EW ARM: DBGU, хитрости в использовании printf.