2014-09-21 6 views
0

char []의 모든 문자를 다른 char []으로 복사하고 싶습니다. 그러나 '\ 0'이 있다고 가정하고, 그 문자를 정상적인 문자로 취급하고 싶습니다. 따라서 char []을 포맷 지정자 % s와 함께 출력 할 때 중간에 멈추지 않아야합니다. 예 :C에서 일반 문자로 Null 종결자를 처리하십시오.

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

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

이 방법이 있습니까?

+0

nul 문자가 종료되는지 여부를 문자열 운영자가 어떻게 알 수 있습니까? – DoxyLover

+0

이것의 목적은 무엇입니까? ac 문자열로 항상 널 문자로만 추가하는 게 어떨까요? –

+0

@DoxyLover 색인화 변수가 문자열의 길이와 같지 않은지 확인합니다. –

답변

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

null 문자의 경우 두 문자 "\"를 인쇄하고 "0". OP의 질문을 읽고, 나는 그가 실제 null 문자를 터미널에 보내길 원한다고 생각한다. 답을 수정하면 if/then/first-printf/else (및 중괄호)를 제거하고 두 번째 printf를 루프에 그대로 두는 것입니다. – DoxyLover

1

사용 memcpy 당신이 복사 할 필요가 얼마나 많은 문자를 알고있는 경우. 예제에서와 같이 x이 실제 배열 인 경우 sizeof(x)은 해당 양을 제공하지만, x을 함수의 매개 변수로 전달하면 sizeof이 해당 함수 내에서 작동하지 않습니다 (포인터 크기 만 표시됨). 기본 규칙은 문자열이 NUL로 종료되어야하며 그렇지 않으면 별도의 변수에 크기를 유지해야한다는 것입니다. 인쇄의

, 당신도 @alk이 시사하는대로 for 루프에서 인쇄하거나 stdout에 (아마도 NUL을 포함) 모든 버퍼를 작성 fwrite를 사용할 수 있습니다 "%s"

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

잘못된 사용. 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 []의 모든 문자를 다른 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]); 
관련 문제