|
Для печати строки, которая не завершается нулевым символом (не 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. |