모든 수 문자열 간주 문자의 배열 ( 예 ), 모든 수 있습니다 문자 배열이 고려 될 문자열 ( 아니오 ).
왜 안돼? 그리고 왜 중요합니까?
문자열의 길이가 문자열의 일부로 저장되지 않으며 문자열이 정의 된 표준에 대한 참조로 설명하는 다른 답변 외에도, 반대쪽은 "C 라이브러리 함수가 문자열을 어떻게 처리합니까?"입니다.
문자 배열은 동일한 문자를 보유 할 수 있지만 마지막 문자 다음에 널 종료 문자 가 없으면 문자 배열입니다 . 그 널 종료 문자는 문자 배열을 문자열로 간주 할 수있게합니다.
문자열을 인수로 예상하는 C의 모든 함수는 문자 시퀀스가 Null 로 끝나기 를 기대합니다 . 왜?
모든 문자열 함수가 작동하는 방식과 관련이 있습니다. 길이는 배열, 문자열 함수의 일부로 포함되지 않기 때문에 널 문자 (예 : '\0'
10 진수와 동일 0
)가 발견 될 때까지 배열에서 스캔합니다 . ASCII 테이블 및 설명을 참조하십시오 . 당신이 사용하는 여부에 관계없이 strcpy
, strchr
, strcspn
, 등 모든 문자열 함수는 의지 NUL - 종료 해당 문자열의 끝이 어디 정의하는 문자 인 존재.
두 개의 유사한 기능을 비교 string.h
하면 널 종료 문자 의 중요성이 강조 됩니다 . 예를 들어 보자.
char *strcpy(char *dest, const char *src);
strcpy
단순히 복사 기능에서 바이트 src
에 dest
때까지 널 (null) 종료 문자가 발견 이야기 strcpy
문자를 복사 중지. 이제 비슷한 기능을 수행하십시오 memcpy
.
void *memcpy(void *dest, const void *src, size_t n);
이 함수는 유사한 작업을 수행하지만 src
매개 변수를 문자열 로 간주하거나 요구하지는 않습니다 . 이후 memcpy
단순히 전진 스캔 할 수 src
바이트 복사 dest
까지 널 (null) 종결 자에 도달 할 때, 이는 세번째 파라미터로 복사 할 바이트의 수를 명시 적으로 요구한다. 이 세 번째 매개 변수는 memcpy
동일한 크기 정보를 제공 strcpy
하며 널 종료 문자를 찾을 때까지 앞으로 스캔하여 간단히 파생 할 수 있습니다.
( null로 끝나는 문자열을 strcpy
함수에 제공하지 않으면 잘못 되거나 (또는 문자열을 기대하는 모든 함수) 무엇이 잘못되는지 강조합니다. 여기서 메모리 세그먼트의 나머지 부분에서 어디에서 멈추고 행복하게 경쟁 할 것인지 전혀 알 수 없습니다 널 문자 가 메모리의 어딘가에서 발견되거나 세그먼트 오류가 발생할 때까지 정의되지 않은 동작 호출
즉 왜 기대 기능 NUL 종료 문자열이 전달되어야합니다 NUL 종료 문자열을하고 그 중요한 이유 .
char str[] = "hello";
사건을 언급해야합니다 .