2014-09-21 4 views
0

Я хочу скопировать все символы в char [] в другой char []. Однако предположим, что существует «\ 0», тогда я хочу рассматривать это как обычный символ - буквально, если хотите. Поэтому, когда я распечатываю char [] с помощью спецификатора формата% s, он не должен останавливаться посередине. , например.Относительно нулевого терминатора как регулярного символа в C

// chars copied to array x 
char x[] = {'h','e','\0','l','l','o','\0'} 

printf("%s\n",x); // prints 'he\0llo' 

Есть ли способ сделать это?

+0

Как оператор строки должен знать, завершается ли нулевой символ или нет? – DoxyLover

+0

Какова цель этого? Почему бы просто не добавить свой нулевой конец самостоятельно, так как всегда требуется строка ac –

+0

@DoxyLover Я уверен, что переменная индексации не равна длине строки - 1. – 2014-09-21 17:28:09

ответ

1

Вам нужно напечатать элемент массива мудрый, переведя непечатаемые символы на то, что вы хотите видеть.

Чтобы распечатать 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]); 
    } 
} 
+0

На нулевом символе вы печатаете два символа «\» и "0". Читая вопрос OP, я считаю, что ему нужен фактический нулевой символ, отправленный на терминал. Корректировка вашего ответа состоит в том, чтобы удалить if/then/first-printf/else (и фигурные скобки) и просто оставить второй printf в цикле. – DoxyLover

1

Используйте memcpy, если вы знаете, сколько символов нужно скопировать. Если x - это реальный массив, как в вашем примере, sizeof(x) предоставит вам эту сумму, но если вы передадите x в качестве параметра функции, то sizeof не будет работать внутри этой функции (он просто покажет размер указателя), поэтому основное правило заключается в том, что ваши строки либо должны быть NUL-terminated, либо вы должны сохранить их размер в отдельной переменной.

Для печати можно либо распечатать в цикле for как предполагает @alk, или использовать fwrite написать любой буфер (возможно, с NULs) для stdout:

fwrite(x, sizeof(x), 1, stdout); /* sizeof will work only for a real array */ 
1

Неправильное использование "%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]); 
Смежные вопросы