programing

기호 \0개에 어떤 의미일까요?

newsource 2022. 8. 8. 20:39

기호 \0개에 어떤 의미일까요?

코드 다음 고려해 보자.

char str[] = "Hello\0";

공백이 배열의 길이 얼마나 많은 0년대 끝난다?

sizeof str는 "Hello" 텍스트의 경우7 ~ 5 바이트, 명시적 NUL 터미네이터 및 암묵적 NUL 터미네이터입니다

strlen(str)는 5 - "Hello" 바이트뿐입니다.

여기서 중요한 심지어 문자열 리터럴 그냥 끝까지 될 수 있다는 내재된 nul 종결자 항상 추가이다.\0.물론이야.strlen맨 처음에 멈추다\0- 차이를 구별하지 못합니다.

그 암시적 NUL 종결자 규칙에 한가지 예외-명시적으로 배열 크기를 지정하는 문자열에 맞게 잘리: 있다.

char str[6] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 6 (with one NUL)
char str[7] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 7 (with two NULs)
char str[8] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 8 (with three NULs per C99 6.7.8.21)

하지만, 이것이 거의 없고, 그리고unterminated 문자열을 결말에서 문자열 길이의 잘못 생각하기 쉬운 유용하다.또한 C++에서 금지되고 있다.

배열의 길이는 7, NUL 문자입니다.\0여전히 문자로 카운트되며 문자열은 여전히 암묵적으로 종료됩니다.\0

샘플을 보기 위해서는 이 링크를 참조하십시오.

를 선언한 점에 주의해 주십시오.str~하듯이char str[6]= "Hello\0";암묵적 NUL은 적합할 경우에만 추가되므로 길이는 6이 됩니다(이 예에서는 해당되지 않음).

§ 6.7.8/p14
문자열 리터럴에 의해 문자 타입의 배열을 초기화할 수 있습니다(옵션으로 중괄호로 묶음).문자열 리터럴의 연속된 문자(공간이 있거나 배열 크기를 알 수 없는 경우 끝 Null 문자 포함)는 배열 요소를 초기화합니다.

char str[] = "Hello\0"; /* sizeof == 7, Explicit + Implicit NUL */
char str[5]= "Hello\0"; /* sizeof == 5, str is "Hello" with no NUL (no longer a C-string, just an array of char). This may trigger compiler warning */
char str[6]= "Hello\0"; /* sizeof == 6, Explicit NUL only */
char str[7]= "Hello\0"; /* sizeof == 7, Explicit + Implicit NUL */
char str[8]= "Hello\0"; /* sizeof == 8, Explicit + two Implicit NUL */

구체적으로는 헷갈릴 수 있는 상황을 하나 언급하고 싶습니다.

"\0"과 "\0"의 차이점은 무엇입니까?

정답은 이다."\0"배열에 나타내는 것은{0 0}그리고.""{0}.

왜냐면"\0"여전히 문자열 리터럴입니다.또,"\0"마지막에는.그리고.""비어 있지만 추가도 가능합니다."\0".

이를 이해하면 이해에 도움이 됩니다."\0"깊이

JUST TRY IT의 드럼 솔로곡을 연주하면, 향후에 이러한 질문에 대답할 수 있습니다.

$ cat junk.c
#include <stdio.h>

char* string = "Hello\0";

int main(int argv, char** argc)
{
    printf("-->%s<--\n", string);
}
$ gcc -S junk.c
$ cat junk.s

필요없는 부분을 피해서...

.LC0:
    .string "Hello"
    .string ""

...

.LC1:
    .string "-->%s<--\n"

...

여기서 printf에 사용한 문자열은"-->%s<---\n"글로벌 스트링은 다음 두 부분으로 나누어져 있습니다."Hello"그리고.""GNU 어셈블러는 또한 암묵적인 명령어로 문자열을 종료합니다.NUL첫 번째 문자열(. "")이의 LC0)가 .NUL입니다. 일곱 살가 특정 알고 과 같은 컴파일러가 을 하고 합니다.-S(GNU의 경우--MSVC에는 어셈블러출력용 플래그가 있습니다만, 즉시는 알 수 없습니다).당신은 빨리 100%이고 당신 안에서 일하면 환경은 도구에 맞춰 보장된 답을 얻을 것이 당신의 코드(경우에 따라 또는 일하는데 실패했습니다)작용하는지에 대해 많은 것을 배울 거다.코드의 동작(또는 경우에 따라서는 동작하지 않는 것)에 대해 많은 것을 알게 되어,작업하고 있는 툴과 100%일치하는 답변을수 있습니다 얻을 신속히환경에.

str 배열의 길이는 얼마이며, 끝은 0으로 끝납니다.

이하에 대해 설명하겠습니다.

int main() {
  char str[] = "Hello\0";
  int length = sizeof str / sizeof str[0];
  // "sizeof array" is the bytes for the whole array (must use a real array, not
  // a pointer), divide by "sizeof array[0]" (sometimes sizeof *array is used)
  // to get the number of items in the array
  printf("array length: %d\n", length);
  printf("last 3 bytes: %02x %02x %02x\n",
         str[length - 3], str[length - 2], str[length - 1]);
  return 0;
}
char str[]= "Hello\0";

7바이트가 됩니다.

기억에는 다음과 같습니다.

48 65 6C 6C 6F 00 00
H  e  l  l  o  \0 \0

편집:

  • 그\0 상징은 C문자열에 어떤 의미일까요?C문자열에서 무엇을 의미합니까 기호는 \0?
    문자열의"끝".끈의 '끝'입니다.Anull이 나온다.늘 문자입니다.기억 속에, 그건 0.기억상으로는은 메시지의 이 마지막 숯이 되다 배열 이 등장 인물을 찾핸들 0점이에요 보통 기능.보통 char 배열을 처리하는 함수는 이 문자를 찾습니다.이는메시지의 끝이기 때문입니다.저 끝에서 예를 들어 정이다.마지막으로 예를 들어볼게요.

  • array의 됩니까?str 열 part part part ( ( 부분 전에 (편편))))
    7

  • 0은요?
    2개 str[]='\0'=0'=0은 0으로 되어 있습니다. str[5]=str[6]='\0'=

「 」:
텍스트 배열의 내용을 인쇄하는 기능이 있다고 가정합니다.을 사용하다

char str[40];

이 어레이의 내용을 변경할 수 있습니다(자세한 내용은 설명하지 않습니다).이렇게 하면, 다음과 같은 메세지가 표시됩니다.

54 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 70 72 69 6e 74
69 6e 67 20 74 65 73 74 00 00 00 00 00 00 00 00 00 00 00 00

그럼 그 문자 배열로 출력해 주세요.그리고 당신은 새로운 메시지를 원합니다.그냥 "안녕하세요"라고 인사하자

48 65 6c 6c 6f 00 73 20 6a 75 73 74 20 61 20 70 72 69 6e 74
69 6e 67 20 74 65 73 74 00 00 00 00 00 00 00 00 00 00 00 00

str[5]의 00에 주목합니다.이렇게 하면 실제 벡터 경도와 전체 컨텐츠에 관계없이 인쇄 기능이 실제로 얼마나 많은 데이터를 전송해야 하는지 알 수 있습니다.

'\0'은 NULL 문자 또는 NULL 터미네이터로 표시됩니다. 아무것도 나타내지 않기 때문에 정수 0(제로)에 해당하는 문자입니다.

C 언어에서는 일반적으로 문자열의 끝을 표시하기 위해 사용됩니다.예제 문자열 a="Arsenic"; 배열에 저장된 모든 문자

a[0]=A
a[1]=r
a[2]=s
a[3]=e
a[4]=n
a[5]=i
a[6]=c

어레이 끝에 문자열 'a'에 대한 어레이 메모리 할당을 중지하는 "\0"이 포함되어 있습니다.

언급URL : https://stackoverflow.com/questions/4711449/what-does-the-symbol-0-mean-in-a-string-literal