2010-12-10 4 views
1

У меня есть массив u_chars, и я хочу напечатать его с помощью printf. Я не знаю размер массива:Печать массива u_chars

u_char *ip_p; 
printf("%s", ip_p); // EXC_BAD_ACCESS D:< 

Я хочу напечатать это. Как я могу это сделать?

+0

Вы используете это, если '* ip_p' указывает на блок, который не заканчивается' NULL'. Как «ip_p» указывает на блокировку чтения/получения/etc.? – birryree

+0

Он находится в структуре, которая назначается из необработанных данных. Это действительно не завершено NULL. Но если я не знаю размер массива, как добавить символ NULL? –

ответ

6

Это невозможно. Указатель не магически содержит информацию о размере указанных данных.

Если нет соглашения (байт терминатора или длина, закодированная где-то), вы не можете знать, сколько данных действительно, и, следовательно, сколько нужно для печати.

0

Если ip_p NUL прекращено, ваш код работает. Глядя на комментарий в фрагменте кода, я бы сказал, что он не завершен ...

1

Если вы не знаете размер, как вы ожидаете, printf знать? Исправьте свой код, чтобы передать размер в качестве дополнительного аргумента. Затем вы можете использовать:

printf("%.*s", size, buf); 

Однако, похоже, что ваши данные могут быть не текстовыми, а бинарными. Если это так, я задаю вопрос о его печати printf ...

0

Если вы не знаете размер данных, как вы можете надеяться на его использование? Размер должен был быть где-то в другом месте, как он туда попал !? Вы должны знать размер или иметь значение дозорного, например, нулевой символ.

Если это не nul-terminated, то «% s» является несоответствующим спецификатором формата. Кроме того, если значения u_char не все печатные символы, вы не должны использовать% s или даже% c. Вы можете использовать% c и заменить непечатаемые символы другим.

Смежные вопросы