2014-04-04 4 views
1

나는 C 프로그래밍과 개발 우분투에서 새로운입니다.숯의 Nulltermination *

나는 몇 가지 예제 코드가 있습니다

char * output1 ="one\0two\0"; 

char * output2 = "";  
char * first = "one"; 
char * second = "two"; 
char * term = "\0"; 

output2 = malloc(20); 
strcat(output2,first); 
strcat(output2,term); 
strcat(output2,second); 
strcat(output2,term); 

printf("%s\n",output2); 
printf("%s\n",output1); 

을 그리고 출력은 다음과 같다 : 그것의 \0

onetwo 
one 

output1 정지의 출력이 있기 때문에. 하지만 \0을 추가 한 후에 output2이 인쇄를 멈추지 않는 이유는 무엇입니까? 방법

내가 뭘 잘못

와 나는 그 출력 인쇄를 사전에

one 

감사를 만들기 위해 \0output2에 추가 할 수 있습니다.

+2

정의되지 않은 행동을해야 하나! – haccks

+1

@haccks UB가 보이지 않습니다. 지적하십시오. 참고 :'output2 = malloc (20);'지금 보았습니다! 'output2 = malloc (20); strcat (output2, first);'U2는'output2'가 certianly '\ 0'종료되지 않고'output2'가 종료 될 것으로 기대하는'strcat (output2, first);가 뒤 따른다. – chux

+0

'strcat'는 간단하게 잘 정의 된 동작을 가지고 있으며, 매뉴얼 페이지에 자세히 설명되어 있습니다. 주의 깊게 읽은 다음 코드에 적용하면 여기에서 무슨 일이 일어나는지 즉시 알려야합니다. –

답변

2

문자열 "\0"char[]{ 0, 0 }과 같습니다. 당신이 strcat를 사용하는 경우는과 최초의 '\0' 등까지 현재 널 종료, 복사 값을 덮어 씁니다, 그래서 이것은 무슨이다 : 지적

output2[3] = 0; 
// or this maybe easier to read 
output2[3] = '\0'; 

:

// ... are garbage values 
strcat(output2,first); // output2 is { 'o', 'n', 'e', '\0', ... } 
strcat(output2,term); // '\0' is overwritten with `\0` so no change. 
strcat(output2,second); // output2 is { 'o', 'n', 'e', 't', 'w', 'o', '\0', ... } 
strcat(output2,term); // '\0' is overwritten with `\0` so no change. 

이 출력 one하려면 의견 (및 기타 답변)에 나와 있습니다.

output2 = malloc(20); 
strcat(output2,first); 

strcat tr 첫번째 널 문자를 찾으십시오. 그러니 그냥 \0에 첫 번째 문자를 설정합니다

output2 = malloc(20); 
output2[0] = 0; // or '\0' 
strcat(output2,first); 
+0

작은 설명을 주셔서 감사합니다. 그러나 이것을 시도 할 때 :'strcat (output2, first); output2 [3] = 0; strcat (output2, second);'여전히 출력으로'onetwo'를 얻습니다. – Leviathan

+0

이것은 좋은 대답의 시작이지만'output2 = malloc (20); strcat (output2, first); ' – chux

+1

@chux 좋은 점. 잘못된 업데이트. – clcto

0

C 문자열의 경우 \0 문자는 항상 문자열의 끝을 표시합니다. 따라서 문자열 ""과 문자열 "\0"은 실제로 후자에 여분의 바이트가 있더라도 동일한 것을 의미합니다.

즉, strcat(foo, "\0")foo에 아무 것도 추가하지 않습니다.

0

output2 = malloc(20); 
strcat(output2,first); 

20 난수 바이트를 할당하는 코드와 다음은 20 바이트로 그

하지만, 출력 2 점 변수를 먼저 문자열을 추가하는 그래서 아무것도있을 수 있습니다 예 :있을 수 있습니다. "A \ 0B \ 0"과 strcat는 A \ 0을 찾아 처음에 추가합니다.

하면 출력 2

memset(output2,0,20); 
+0

20 개를 모두 설정해야하는 이유는 무엇입니까? – clcto

+0

기술적으로 당신이 당연히 맞습니다. 쓰레기가 배열에 들어 왔는지 아닌지를 알기 위해 디버깅 할 때 쉽게 발견했기 때문에 습관이 있습니다. –

1

strcat(dest, src) 동작은 다음과 같다 initalize해야합니다 전 널 문자를 무시

  • 복사 srcdest로,

    1. 신지의 첫 '\0'까지 건너 뛰고 끝에 하나 추가.

    strcat(output2, term) 호출이 strcat(outpu2, second) 호출로 무시되고 있습니다. 당신이 정의되지 않은 동작 (UB)의 경우이

    주의 사항 : output2 = malloc(20)을 쓸 때 이제

    , 당신은 할당 된 메모리가 null 초기화임을 보장되지 것입니다. strcat()'\0'을 검색합니다. malloc()의 20 바이트를 할당 할 수 있습니다.

    당신은

    output2 = calloc(20, sizeof(char)); 
    strcat(output2,first); 
    strcat(output2,term); 
    strcat(output2,second); 
    strcat(output2,term); 
    

    또는

    output2 = malloc(20); 
    strcpy(output2,first); 
    strcat(output2,term); 
    strcat(output2,second); 
    strcat(output2,term); 
    

    또는

    output2 = malloc(20); 
    memset(output2, '\0', 20); // Or output2[0] = '\0'; 
    strcat(output2,first); 
    strcat(output2,term); 
    strcat(output2,second); 
    strcat(output2,term);