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));
}
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
![](http://daplus.net/wp-content/uploads/2023/04/coupang_part-e1630022808943-2.png)