Программирование ARM: решение проблем, FAQ Как напечатать не ASCIIZ строку, если известна её длина? Fri, March 27 2026  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Как напечатать не 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.

 

Добавить комментарий


Защитный код
Обновить

Top of Page