2010-05-26 11 views
24

gcc 4.4.4 c89null 문자열 종료 null

문자열을 종료하는 표준 방법은 무엇입니까? NULL을 사용할 때 경고 메시지가 나타납니다.

*dest++ = 0; 
*dest++ = '\0'; 
*dest++ = NULL; /* Warning: Assignment takes integer from pointer without a cast */ 

소스 코드 :

size_t s_strscpy(char *dest, const char *src, const size_t len) 
{ 
    /* Copy the contents from src to dest */ 
    size_t i = 0; 
    for(i = 0; i < len; i++) 
    *dest++ = *src++; 

    /* Null terminate dest */ 
    *dest++ = 0; 

    return i; 
} 

또 다른 질문 : 나는 의도적으로 종료를 널 (null) 라인을 주석. 그러나, 그것은 여전히 ​​dest의 내용을 정확하게 출력합니다. 이 함수의 호출자는 NULL을 포함하거나 포함하지 않고 문자열의 길이를 보냅니다. 즉 strlen(src) + 1 또는 stlen(src)입니다.

size_t s_strscpy(char *dest, const char *src, const size_t len) 
{ 
    /* Copy the contents from src to dest */ 
    size_t i = 0; 
    /* Don't copy the null terminator */ 
    for(i = 0; i < len - 1; i++) 
    *dest++ = *src++; 

    /* Don't add the Null terminator */ 
    /* *dest++ = 0; */ 

    return i; 
} 
+13

'* dest ++ = '\ 0'을 선호합니다. ''\ 0 ''이이 문맥에서 올바른 타입을 가지고 있기 때문에. –

+5

@ Paul R : 왜 대답하지 않으시겠습니까? – Lucas

+0

'* dest ++ = 0;'왜 deferenced 값을 0으로 할당 한 후 포인터를 사후 증분 하는가? – Larry

답변

35

첫 번째 질문 : 나는 Paul R의 코멘트에 가서 '\0'으로 끝납니다. 그러나 값 0 자체도 잘 작동합니다. 맛의 문제. 하지만 MACRO NULL은 포인터 용으로 사용하지 마십시오.

두 번째 질문 : 문자열이 \0으로 끝나지 않는 경우 문자열이 인쇄 할 수없는 문자이기 때문에 예상되는 출력을 계속 인쇄 할 수 있습니다. 이것은 정말로 불쾌한 버그입니다. 예상하지 못했을 때 폭발 할 수도 있기 때문입니다. 항상'\0' 인 문자열을 종료합니다.

7

'\ 0'은가는 길입니다. 그것은 문자이고, 문자열에서 원하고 null 값을가집니다.

C/C++에서 null로 끝나는 문자열을 말하면 실제로 'zero terminated string'을 의미합니다. NULL 매크로는 종료 문자열에 사용하기위한 것이 아닙니다.

+0

' '\ 0'', 문자 인 경우, 꽤 큰 것입니다!. 아마도 오늘날 대부분의 컴퓨터에서'C' 컴파일러를 사용하면 sizeof ('\ 0') == 4가 될 것입니다 (아마도 8031 ​​마이크로 컨트롤러는 예외입니까?). –

+0

@Joseph.나는 네가 어디에서 왔는지 확신하지 못한다. sizeof ('\ 0')는 제 컴파일러에서 1 바이트로 나옵니다. 더블 바이트 문자 인 경우 sizeof (L '\ 0')은 2입니다. –

+6

.c 파일에서는 .cpp 파일이나 g ++에서 1이지만, .c 파일에서는 4입니다. C++가 아니라 C로 태그가 지정됩니다. –

11

be 매우주의 : NULL은 주로 포인터에 사용되는 매크로입니다. 문자열을 종료의 표준 방법은 다음과 같습니다

이 (아래)
char *buffer; 
... 
buffer[end_position] = '\0'; 

도 작동하지만 그것은 INT/짧은/긴 배열에 정수 값을 할당하고 문자 값을 할당 사이에 큰 차이가 없습니다. 이것이 첫 번째 버전이 선호되고 개인적으로 내가 더 좋아진 이유입니다. 때 comp.lang.c 자주 묻는 질문에서

buffer[end_position] = 0; 
+0

' '\ 0''은 상수입니다 타입 int의 C. –

17

: http://c-faq.com/null/varieties.html

본질적으로 : NULL (널 포인터에 대한 처리기 매크로) NUL (null 문자)와 동일하지 않습니다.

+8

+1; 그것은 정말로 "NULL로 끝나는 문자열"을 볼 때마다 항상 버그가납니다. 도대체, 문자열 터미네이터는 NULL이 아니며, NUL입니다! –