C에서 '\ 0'및 printf ()


21

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

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

Output: 5

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


1
코드가 적어도 누락되었다는 사실 외에도 해당 코드로 );무엇을 보여 주려고합니까? 그것으로 끝나지 않는다는 것을 어떻게 증명 \0했습니까?
glglgl

그리고 저장된 메모리는 무엇과 관련이 있습니까?
Tsakiroglou Fotis

C에서 모든 리터럴 문자열은 실제로 널 종료 자를 포함 하는 문자 배열입니다 .
일부 프로그래머 친구

@glglgl printf ()가 화면에 인쇄 할 문자 수를 반환한다고 생각합니다.
Ajay Mishra

4
@AjayMishra 예, 실제로 5자를 인쇄해야합니다. 종료 0 바이트는 화면에 인쇄되지 않습니다.
glglgl

답변:


13

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

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

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

나는 이야기가 다를 것이라고 생각했다 printf(). TBH 나는 어떻게 printf()작동 하는지 모른다 .
Ajay Mishra

8

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

6

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

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

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


6

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

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


어쨌든 문자열을 배열에 저장하지 않고 이것을 확인할 수 있습니까?
Ajay Mishra

1
@AjayMishra 잘 문자열이 이미 있다 (언급 한 바와 같이) 배열에 ...하지만이 아닌 경우 널 터미네이터는 printf문자열의 경계 밖으로 이동하고 "임의"또는 "쓰레기"문자를 인쇄하고, 반환 것 문자열의 길이와 다른 숫자입니다. 이미 문자열의 길이를 알고있는 경우 해당 인덱스에있는 문자 인 경우도 확인할 수 있습니다 '\0'작동하지만 배열의 크기가 같이 (터미네이터를 포함하지 않는 경우 기술적으로 정의되지 않은 동작 인 것이다 char arr[5] = "hello";을 추가 할 것이다, 배열에 터미네이터).
일부 프로그래머 친구

@AjayMishra 예 예. char * p = "Hello"; int i = 0; while (p[i] != '\0') { printf("%d: %c", i, p[i]); i++; }실행 방법을 볼 수 있습니다. 인덱스가있는 줄과 해당 줄의 내용을 보여줍니다. 인덱스 4 이후에는 0 문자를 찾아 while 루프를 중단합니다. 거기에 0 문자가 있음을 알 수 있습니다.
glglgl

6

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

#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임을 알 수 있습니다.


4

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

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


3

그러나 문자열을 인쇄하려면 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

0

당신은 먼저 개념을 지워야합니다. 배열을 다룰 때 지워질 것이므로, 당신이 사용하는 인쇄 명령은 단지 마비 안에 놓인 문자들을 세는 것입니다. 배열 문자열에서 \ 0으로 끝나야합니다.


0

문자열은 문자로 구성된 벡터입니다. 문자열을 형성하는 일련의 문자를 포함하고 그 뒤에 특수한 끝 문자 문자열이 있습니다 : '\ 0'

예 : char str [10] = { 'H', 'e', ​​'l', 'l', 'o', '\ 0'};

예 : 다음 문자형 벡터는 '\ 0'으로 끝나지 않기 때문에 하나의 문자열이 아닙니다.

char str [2] = { 'h', 'e'};


C에는 벡터가 없습니다.
Ajay Mishra
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.