Обрабатывать нулевой терминатор как обычный символ в C
Я хочу скопировать все символы в символе [] в другой символ []. Однако, предположим, что есть '\0', тогда я хочу рассматривать его как нормальный символ - литерал, если хотите. Поэтому, когда я распечатываю char[] с указателем формата%s, он не должен останавливаться посередине. например
// chars copied to array x
char x[] = {'h','e','\0','l','l','o','\0'}
printf("%s\n",x); // prints 'he\0llo'
Есть ли способ сделать это?
3 ответа
Вам нужно печатать элемент массива, переводя непечатаемые символы в то, что вы хотите видеть вместо этого.
Распечатать he\0llo\0
делать:
char x[] = {'h','e','\0','l','l','o','\0'};
for (size_t i = 0; i < sizeof(x); ++i)
{
if ('\0' == x[i])
{
printf("%s", "\\0");
}
else
{
printf("%c", x[i]);
}
}
Использование memcpy
если вы знаете, сколько символов вам нужно скопировать. Если x
это реальный массив, как в вашем примере, sizeof(x)
даст вам эту сумму, но если вы сдадите x
в качестве параметра функции, sizeof
не будет работать внутри этой функции (он просто покажет размер указателя), поэтому основное правило заключается в том, что ваши строки должны либо заканчиваться NUL, либо вы должны хранить их размер в отдельной переменной.
Для печати вы можете распечатать в for
цикл, как предлагает @alk, или используйте fwrite
записать любой буфер (возможно, с NUL) в stdout
:
fwrite(x, sizeof(x), 1, stdout); /* sizeof will work only for a real array */
Неправильное использование "%s"
, Там нет способа использовать printf("%s"
распечатать массив с данными после первого нулевого символа или '\0'
,
char x[] = {'h','e','\0','l','l','o','\0'}
printf("%s\n",x); // This only prints "he"
printf("%s",...
для печати строк. x
строка только до первого включительно '\0'
,
Чтобы "скопировать все символы в char[] в другой символ [].", Используйте memcpy()
,
char x[] = {'h','e','\0','l','l','o','\0'}
char y[sizeof x];
memcpy(y, x, sizeof x);
Код мог бы использовать "%c"
напечатать все, но что печатается с '\0'
варьируется среди систем.
size_t i;
for (i=0; i< sizeof x; i++)
printf("%c", x[i]);