숫자 배열이 '\0' 또는 null 문자로 끝나지 않는 이유는 무엇입니까?
숫자 배열이 null 문자로 끝나지 않는 이유는 무엇입니까?
예를들면,
char name[] = {'V', 'I', 'J', 'A', 'Y', '\0'};
하지만 숫자 배열의 경우 끝에 null 문자가 표시되지 않습니다.
예를들면,
int marks[] = {20, 22, 23};
그 뒤에 있는 이유는 무엇입니까?
이라는 있습니다char
배열은 null 문자로 끝납니다. 있는 것은 . 바로 이다입니다.char
y(으)로\0
:
char no_zero[] = { 'f', 'o', 'o' };
char
합니다.합니다.
에서 char
.array는 null다입니다. 왜냐하면 null 문자를 만들었기 때문입니다.컴파일러가 널 문자를 삽입하는 유일한 장소는 문자열 리터럴에서 문자 배열을 선언할 때입니다. 예를 들어 다음과 같습니다.
char name[] = "VIJAY";
// the above is sugar for:
char name[] = { 'V', 'I', 'J', 'A', 'Y', '\0' };
이 경우 결과 배열을 유효한 C 문자열로 만들기 위해 null 문자가 자동으로 삽입됩니다.다른 숫자 유형의 배열에는 이러한 요구 사항이 없으며 문자열 리터럴에서 초기화할 수도 없습니다.즉, 0은 완벽하게 유효한 숫자이므로 배열 끝을 찾기 위해 0을 사용하는 코드는 없기 때문에 숫자 배열에 0을 추가하는 것은 아무런 도움이 되지 않을 것입니다.
포인터의 배열은 때때로 NULL 포인터로 종료되는데, NULL 포인터는 유효한 포인터와 혼동할 수 없기 때문에 말이 됩니다.argv
수신한 main()
입니다.입니다.
배열은 배열 요소 유형의 유효한 값인 모든 것으로 끝날 수 있습니다.만.\0
dchar
배열을 문자열이라고 합니다.
예를들면
char name[]={'V','I','J','A','Y'};
와 수 입니다.strlen
타
C OP 의로부터, C , 와 모든 .'a'
,'1'
,을 포함한'\0'
eint
. 그리고 당신은 A를 넣을 수 있습니다.'\0'
int
배열은 다음과 같습니다.
int arr[] = {20, 22, 23, '\0'};
가 왜냐하면 그건 관례적인 일이기 때문입니다.'\0'
종료된 문자열에만 사용됩니다.다에 합니다.
int arr[] = {20, 22, 23, 0};
문자열은 0 터미네이터로 끝나지만 문자열은 배열과 같지 않습니다.문자열을 저장하기 위해 배열을 사용하지만 문자열이 아닌 것도 저장하기 위해 배열을 사용합니다.그렇기 때문에 일반적으로 배열에는 0이 자동으로 추가되지 않습니다.
의 에서도,int
이 아닌)일 수 0 한( 센티넬) 일 수 있습니다.
당신은 할 수 있습니다.int
h0
원하는 경우에는 다음과 같이 하십시오.
int iarray[] = {1, 2, 3, 0};
부터.'\0'
그리고.0
똑같습니다.도 있습니다. 당신은 심지어 그것을 대체할 수 있습니다.0
'\0'
.
당신이 스러워 하는 는 의 자동 도 있습니다.'\0'
다음과 같은 선언으로
char s[] = "hello";
의 ,s
입니다에 합니다.char s[] = {'h', 'e', 'l', 'l', 'o', '\0'};
이것은 C 표준에서 제공하는 편리한 바로가기라고 생각하세요.원하는 경우 크기에 대해 명시적으로 지정하여 0이 아닌 종료 문자 배열을 강제 적용할 수 있습니다.
char s[5] = "hello";
에서,s
없을 것입니다NUL
C 입니다 .int
,그렇게'\0'
입니다.int
(,char
는 적분 형식입니다.)
어레이의 길이를 추적하는 방법은 세 가지에서 네 가지 정도가 있으며, 그 중 두 가지 방법만이 C에서 일반적입니다.
길이를 직접 기록하고 포인터와 함께 전달합니다.
어레이는 일반적으로 이렇게 작동합니다.특별한 포맷이 필요 없고, 서브어레이 뷰를 표현하기에 사소합니다. (포인터에 더하고, 길이에서 빼면 됩니다.)
문자열이 아닌 배열과 함께 작동하는 표준 라이브러리의 모든 기능은 이미 이를 예상합니다. 문자열을 엉망으로 :들:
strncat
아니면fgets
안전을 위하여 합니다."sentinel" 값으로 배열을 종료합니다.
C 문자열은 이렇게 동작합니다.하는 거의 합입니다를 입니다.
'\0'
인쇄할 수 없는 "아무것도 하지 않음" 컨트롤 문자로서 텍스트의 일반적인 부분이 아니므로 문자열을 종료하는 데 사용하는 것이 타당합니다.이를
char[]
하지만 바이트 배열로서 길이를 지정해야 합니다.바이트는 문자가 아니기 때문입니다.일단 문자보다는 바이트를 다루게 되면,0
보초 값으로서의 의미를 잃고 평범한 오래된 데이터로 돌아갑니다.입니다.
sizeof(type)
바이트는 유효하고 유용한 값을 나타낼 수 있습니다.적분값의 경우 0이 특히 일반적입니다. 모든 컴퓨팅에서 가장 많이 사용되고 가장 유용한 숫자 중 하나일 것입니다.제가 기대하고 있는 것은0
내 데이터의 절반을 잃어버리는 것처럼 보이지 않고 정수 배열로.그렇다면 문제는 무엇이 좋은 보초 값인가 하는 것입니다.그 외에 어떤 법적 번호를 배열로 금지해야 합니까?그리고 그 질문은 보편적으로 좋은 답이 아닙니다. 그것은 전적으로 여러분의 데이터에 달려있습니다.그러니 당신이 그런 일을 하고 싶다면, 당신은 스스로 해야 합니다.
적절한 보초 값이 없다는 것 외에도, 이 접근법은 또 다른 이유로 문자가 아닌 유형과 함께 평평합니다. 배열의 하위 집합을 나타내는 것이 더 복잡합니다.재귀 함수가 배열의 일부를 자신에게 전달하려면 보초 값을 삽입하고 자신을 호출한 다음 이전 값을 복원해야 합니다.또는 범위 시작과 범위 길이에 대한 포인터를 전달할 수 있습니다.하지만 잠깐만, 그게 당신이 피하려는게 아닌가요?:P
완성도를 위해 두 가지 다른 방법은 다음과 같습니다.
데이터에 대한 포인터와 함께 배열의 길이를 저장할 수 있는 구조를 만듭니다.
이는 보다 객체 지향적인 접근 방식이며, 거의 모든 현대 언어에서 배열이 작동하는 방식입니다(그리고 벡터가 C++에서 작동하는 방식).이러한 구조물을 관리할 수 있는 API가 있고, 해당 API를 종교적으로 사용하는 경우에는 정상적으로 작동합니다. (객체 지향 언어는 API를 객체 자체에 부착하는 방법을 제공합니다.C는 그렇지 않으므로 API를 고수하는 것은 사용자에게 달려 있습니다.)그러나 구조물과 함께 작동하도록 설계되지 않은 함수는 위의 두 가지 방법 중 하나를 사용하여 포인터(그리고 길이)를 전달해야 합니다.
두 개의 포인터를 전달합니다.
이것은 C++에서 "범위"를 통과하는 일반적인 방법입니다.배열의 시작 부분에 포인터를 전달하고, 끝 부분 바로 뒤에 포인터를 전달합니다.만 C에는만서,
(start,length)
그리고.(start,end)
동일한 데이터를 나타내고 C에는 이를 훨씬 더 유용하게 만드는 반복기와 템플릿이 없습니다.
C 을 종료해야 .'\0'
이것이 도서관이 끈이 어디서 끝나는지를 아는 방법이기 때문입니다.
-termination은 문자열과 문자 배열을 구분하는 것입니다. (aNUL
- 종료된 char-array).의 문자열 기능을 사용합니다.NUL
문자열이 언제 완료되었는지(그리고 작업이 완료되었는지) 알고 단순한 char-array로 작동하지 않습니다(예:그들은 배열의 경계를 지나 계속 작업할 것이고, 그것이 발견될 때까지 계속할 것입니다.NUL
메모리 어딘가에 - 종종 메모리가 손상되는 경우가 있습니다.
문자 배열 끝에 반드시 문자가 있어야 하는 것은 아닙니다!이는 잘못된 가정입니다.당신이 해야 한다는 규칙은 없습니다.문자(char
type)다.
표준 패밀리 함수를 사용하여 배열을 인쇄하려면 null 종단 문자 배열이 있어야 합니다.하지만 그 기능들이 캐릭터 배열의 끝에 달려있기 때문에 -'\0'
함수에는 예상되는 데이터의 종류와 관련된 규칙이 있는 경우가 많습니다.열()char[]
함수도 예외는 아닙니다.하지만 이것은 언어 요구 사항이 아니라 사용 중인 API에 이러한 요구 사항이 있습니다.
.'\0'
끈으로 취급할 수 있도록 말입니다.그리고 문자열을 조작할 때 해당 문자열의 길이(경계)를 구분할 수 있는 방법이 있어야 합니다.
strcpy의 기능 프로토타입 보기
char * strcpy ( char * destination, const char * source );
원본에서 대상으로 몇 자를 복사하는지 어떻게 알 수 있습니까?입니다의 입니다.'\0
'.
'\0'
때.때 char다입니다.char *
.없이.'\0'
수 char *
가 .0\
입니다로 해야 하는 하는 것입니다.\0
종기의 하는 표준 는 the를 사용합니다.\0
하려면 이 합니다를 함을 \0
종료 전제 조건 만약 당신의 문자 배열 사용이 그러한 기능을 사용하지 않는다면 그것은 필요하지 않습니다가 필요하지않습니다.\0
char 배열이 반드시 \0으로 끝날 필요는 없습니다.
문자열은 \0으로 끝나는 것이 C 규칙입니다.
문자열의 끝을 찾는 데 유용합니다.
그러나 char 형식의 데이터만 보유하고 싶다면 끝에 0을 가질 수도 있고 그렇지 않을 수도 있습니다.
char 배열을 문자열로 사용하고자 하는 경우, 문자열 끝에 \0을 추가해야 합니다.
편집: \0으로 끝나는 것은 문자열 리터럴이지 char 배열이 아닙니다.
질문의 형식이 틀렸습니다.
예를 들어, \0이 정수 배열로 취해질 경우 어떻게 혼동하는지 설명합니다:-
int marks[]={20,22,23,0,93,'\0'};
^
따라서 이제 배열은 0(표시)이 배열의 끝 부분이며 이는 참이 아니라고 가정합니다.
\0
일반적으로 문자열을 종료할 때 사용됩니다.g\0
문자열의 끝으로 간주됩니다.
예에서는 '\0'으로 종료할 필요가 없습니다.
매우 흥미로운 위키 게시물을 찾았습니다:-
C(및 C에서 파생된 언어)가 개발될 당시에는 메모리가 극도로 제한되어 있었기 때문에 문자열의 길이를 저장하기 위해 오버헤드를 1바이트만 사용하는 것이 매력적이었습니다.그 당시 유일하게 인기있는 대안은 보통 "파스칼 문자열"이라고 불렸지만(BASIC의 초기 버전에서도 사용됨) 문자열의 길이를 저장하기 위해 선행 바이트를 사용했습니다.이를 통해 문자열에 NUL이 포함될 수 있으며 길이를 찾는 데 한 번의 메모리 액세스(O(1)(정시) 시간)만 필요합니다.그러나 C 설계자 Dennis Ritchie는 8비트 또는 9비트 슬롯에 카운트를 유지함으로써 발생하는 문자열 길이의 제한을 피하기 위해 BCPL에서 이미 확립된 NUL 종료 규정을 따르기로 선택했습니다. 또한 부분적으로는 카운트를 유지하는 것이 우리의 경험에서 터미네이터를 사용하는 것보다 덜 편리해 보였기 때문이기도 합니다.
관련 게시물도 확인합니다: - int 배열을(를) 종료합니다.
우리는 관습이 있습니다: 특별한 캐릭터.'0'
0
합니다.
하지만 만약 당신이 끝을 표시하고 싶다면.int
어레이, 당신은 어떻게 그것을 알 수 있습니까?0
유효한 배열 멤버 또는 배열 끝 표시입니까?그래서 일반적으로 그런 표식을 갖는 것은 불가능합니다.
즉,
'\0'
, 단,님)는 )'0'
, 코드를48
) 텍스트 문자열의 문맥상 의미가 없기 때문에 배열 끝 표시로 사용할 수 있습니다.
0
아니면\0
(동일함), 유효한 정수입니다.의미가 있을 수 있기 때문에 배열 끝 표시로 사용할 수 없습니다.
int votesInThisThread[] = { 0, -1, 5, 0, 2, 0 }; // Zeroes here is a valid numbers of upvotes
이 0
0 의
그것이 바로 그 질문에 관한 것입니까?
언급URL : https://stackoverflow.com/questions/19331941/why-dont-numeric-arrays-end-with-a-0-or-null-character
'itsource' 카테고리의 다른 글
Oracle, PDO_OCI 대 OCI8 (0) | 2023.09.19 |
---|---|
오류: window powershell을 사용하여 새 각도 프로젝트를 만들 때 "운영 체제에서 작업이 거부되었습니다." (0) | 2023.09.19 |
예기치 않은 롤백예외:트랜잭션이 롤백 전용으로 표시되어 롤백되었습니다. (0) | 2023.09.19 |
MySQL에서 병합 문을 사용할 수 있는지 여부 (0) | 2023.09.19 |
인터넷 익스플로러 8의 jQuery 문제 (0) | 2023.09.19 |