Обрабатывать нулевой терминатор как обычный символ в 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]);
Другие вопросы по тегам