[c] C에서 ‘\ 0’및 printf ()

C의 입문 과정에서 문자열을 저장하는 동안 문자열 \0끝에 null 문자가 저장된다는 것을 알게 되었습니다. 그러나 문자열을 인쇄하려면 다음 문장으로 printf("hello")끝나지 않는다는 것을 알았지 만 어떻게해야합니까?\0

printf("%d", printf("hello"));

Output: 5

그러나 문자열과 같은 변수가 주 메모리에 저장된다는 것을 알기 때문에 일관성이없는 것처럼 보이며 무언가를 인쇄하는 동안 주 메모리에도 저장 될 수 있다고 생각합니다. 그 이유는 무엇입니까?



답변

널 바이트는 문자열의 끝을 표시합니다. 문자열의 길이에 포함되지 않으며 문자열이로 인쇄 될 때 인쇄되지 않습니다 printf. 기본적으로 널 바이트는 중지 할 때 문자열 조작을 수행하는 함수를 알려줍니다.

차이점은 char문자열로 초기화 된 배열 을 만드는 것 입니다. sizeof연산자를 사용하면 null 바이트를 포함하여 배열의 크기가 반영됩니다. 예를 들면 다음과 같습니다.

char str[] = "hello";
printf("len=%zu\n", strlen(str));     // prints 5
printf("size=%zu\n", sizeof(str));    // prints 6


답변

printf인쇄 된 문자 수를 반환합니다. '\0'인쇄되지 않습니다-단지이 문자열에 더 이상 문자가 없음을 나타냅니다. 문자열 길이에도 포함되지 않습니다

int main()
{
    char string[] = "hello";

    printf("szieof(string) = %zu, strlen(string) = %zu\n", sizeof(string), strlen(string));
}

https://godbolt.org/z/wYn33e

sizeof(string) = 6, strlen(string) = 5


답변

당신의 가정이 잘못되었습니다. 문자열은 실제로로 끝납니다 \0.

그것은 5 문자 포함 h, e, l, l, o와 0 문자.

“내부” print()호출이 출력하는 것은 인쇄 된 문자 수이며 5입니다.


답변

C에서 모든 리터럴 문자열은 실제로 널 종료자를 포함하는 문자 배열입니다.

그러나, 널 종결되어 있지 문자열 (문자 없음)의 길이를 계산하고, 인쇄 아니에요. null 종료자가 발견되면 인쇄 가 중지 됩니다.


답변

모든 답변은 정말 훌륭하지만 다른 예제를 추가 하여이 모든 것을 완료하고 싶습니다.

#include <stdio.h>

int main()
{
    char a_char_array[12] = "Hello world";

    printf("%s", a_char_array);
    printf("\n");

    a_char_array[4] = 0; //0 is ASCII for null terminator

    printf("%s", a_char_array);
    printf("\n");

    return 0;
}

온라인 gdb에서 시도하지 않으려는 경우 출력은 다음과 같습니다.

안녕하세요 세계

지옥

https://linux.die.net/man/3/printf

이스케이프 종결자가 무엇을 이해하는지 이해하는 데 도움이됩니까? char 배열이나 문자열의 경계가 아닙니다. -STOP을 파싱하는 사람에게 말할 문자는 여기까지 (인쇄) 파싱합니다.

추신 : 그리고 당신이 구문 분석하고 문자 배열로 인쇄하면

for(i=0; i<12; i++)
{
    printf("%c", a_char_array[i]);
}
printf("\n");

당신은 얻는다 :

지옥 세계

여기서 double l 뒤의 공백은 null 종결 자이지만 char 배열을 구문 분석하면 모든 바이트의 char 값만됩니다. 다른 구문 분석을 수행하고 각 바이트의 int 값 ( “% d %, char_array [i])을 인쇄하면 (ASCII 코드로 표시됨) 공백 값이 0임을 알 수 있습니다.


답변

in C함수 printf()는 인쇄 된 문자 수를 반환합니다 \0. null종결자는 c 언어로 문자열의 끝을 나타내는 데 사용되며로 string타입이 내장되어 있지 c++않지만 배열 크기는 char원하는 수보다 최소 커야 합니다. 저장합니다.

참조는 다음과 같습니다. cpp ref printf ()


답변

그러나 문자열을 인쇄하려면 printf ( “hello”)라고 말하십시오. 다음 명령문으로 \ 0으로 끝나지 않는다는 것을 알았습니다.

printf("%d", printf("hello"));

Output: 5

당신은 잘못. 이 문은 문자열 리터럴 "hello"이 끝나는 0 문자로 끝나지 않는다는 것을 확인 하지 않습니다 '\0'. 이 명령문 printf은 종료 0 문자가 나타날 때까지 함수 가 문자열의 요소를 출력 함을 확인했습니다 .

위의 명령문에서와 같이 문자열 리터럴을 사용하는 경우 컴파일러는 문자열 리터럴의 요소를 포함하는 정적 저장 기간을 갖는 문자 배열을 작성합니다.

사실이 표현은

printf("hello")

다음과 같은 컴파일러에 의해 처리됩니다.

static char string_literal_hello[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
printf( string_literal_hello );

이 함수의 printf 동작은 다음과 같이 상상할 수 있습니다.

int printf( const char *string_literal )
{
    int result = 0;

    for ( ; *string_literal != '\0'; ++string_literal )
    {
        putchar( *string_literal );
        ++result;
    }

    return result;
}

문자열 리터럴 “hello”에 저장된 문자 수를 얻으려면 다음 프로그램을 실행할 수 있습니다.

#include <stdio.h>

int main(void)
{
    char literal[] = "hello";

    printf( "The size of the literal \"%s\" is %zu\n", literal, sizeof( literal ) );

    return 0;
}

프로그램 출력은

The size of the literal "hello" is 6