C

문자열

MDanderson 2023. 12. 12. 15:54

C 언어에는 문자열 자료형이 내장되어 있지 않습니다. 대신, 문자열은 문자 배열(char array)로 표현되며, 문자열의 끝은 NULL 문자('\0')로 표시됩니다. 이러한 문자 배열을 "C 스타일 문자열"이라고도 합니다.

C에서 문자열을 다루기 위해서는 주로 <string.h> 헤더에 정의된 함수들을 사용합니다.

다음은 C에서 문자열을 출력하는 기본적인 예시입니다:

 

위 코드에서 str은 Hello, World!라는 문자열을 저장하는 문자 배열입니다. 문자열의 끝에는 자동으로 NULL 문자('\0')가 추가됩니다.

printf 함수의 %s 형식 지정자를 사용하여 문자열을 출력할 수 있습니다.

 


char s1[10];    // 크기가 10인 char형 배열을 선언
printf("문자열을 입력하세요: ");
scanf("%s", s1);     // 표준 입력을 받아서 배열 형태의 문자열에 저장
printf("%s\n", s1);  // 문자열의 내용을 출력


위 코드에서, 보통 scanf 에서는 두번째 인자로 주소값을 넣는데 왜 &s1이렇게 안해주는걸까?

 

scanf 함수에서 문자열을 입력 받을 때는 & (주소 연산자)를 사용하지 않는 이유는 문자열 이름 자체가 해당 문자열의 시작 주소를 나타내기 때문입니다.

배열 이름, 예를 들면 s1,은 배열의 첫 번째 원소의 주소를 나타냅니다. 따라서 s1는 &s1[0]과 동일한 주소값을 가집니다.

 

 


왜 에러가 날까?


char 배열에 직접 문자열을 할당하는 것은 C 언어에서 허용되지 않습니다. 대신 strcpy 함수를 사용하여 문자열을 복사할 수 있습니다. strcpy 함수를 사용하려면 string.h 헤더 파일을 포함해야 합니다.

 


ptr는 문자열 포인터(char *)입니다. 여기서 ptr가 가리키는 것은 문자열의 주소 중 'a' 문자가 처음으로 나타나는 위치의 주소입니다.

%p 형식 지정자를 사용하면 주소 값을 16진수로 출력할 수 있습니다. 그러나 여기서 의도는 'a' 문자를 발견한 위치부터의 문자열을 출력하는 것입니다. 따라서 %s 형식 지정자를 사용하여 문자열을 출력합니다.

다시 말해, printf("%s\n", ptr);는 ptr이 가리키는 주소에서 시작하여 문자열의 끝(\0 널 문자)까지의 문자열을 출력합니다.

만약 주소 값을 출력하려면 printf("%p\n", ptr);와 같이 사용할 수 있습니다. 하지만 이 예제에서는 문자열의 내용을 출력하는 것이 목적이므로 %s를 사용하는 것이 옳습니다.

 

 

 

printf("%s\n", *ptr) 이 왜 틀렸을까?

주소를 출력할거면  printf("주소:%p\n", ptr); %p와 ptr을 쓰고  값을 출력할거면 %c나 %d 와 같은 *ptr (역참조)를 쓰라고 배웠는데 왜 문자열에서는 역참조를안쓰고 %s 와 ptr을 쓰는걸까

 

문자열과 포인터에서 %s와 %p, 그리고 역참조 *ptr의 사용에 대해 설명드리겠습니다.

C 언어에서 문자열은 문자의 배열로 표현되며, 문자열의 이름(또는 포인터)은 배열의 첫 번째 문자를 가리키는 주소입니다. printf 함수를 사용할 때 문자열을 출력하기 위해 %s 형식 지정자를 사용하고, 문자열의 주소를 출력하기 위해 %p 형식 지정자를 사용합니다.

문자열의 주소 출력 (%p):
printf("주소:%p\n", ptr);
여기서 %p는 포인터의 주소를 출력합니다.
ptr은 문자열의 시작 주소를 가리키는 포인터입니다.

 

문자열 출력 (%s):
printf("%s\n", ptr);
여기서 %s는 문자열을 출력합니다.
ptr이 가리키는 주소부터 시작하여 널 문자(\0)를 만날 때까지의 모든 문자들을 출력합니다.

 

역참조 (*ptr):
일반적으로 *ptr은 포인터가 가리키는 메모리 위치의 값을 역참조하여 가져옵니다.
문자열의 경우, ptr이 문자열을 가리키는 포인터라면, *ptr은 문자열의 첫 번째 문자를 가리킵니다. 따라서 printf("%c", *ptr);는 첫 번째 문자만을 출력합니다.
즉, 문자열에서 %s와 포인터 ptr을 사용하는 이유는 ptr이 문자열의 시작 주소를 가리키고 있으며, %s가 이 주소에서 시작하는 문자열 전체를 출력하기 때문입니다. 반면에 *ptr을 사용하면 포인터가 가리키는 단일 문자만을 출력하게 됩니다. %s는 문자열 전체를 출력하는 데 사용되며, 이때 문자열은 항상 첫 번째 문자의 주소로 표현됩니다.

 

 

printf("%s\n", ptr);    이부분도 ptr의 주소값을 %s로 표현하라는 의미로 헷갈릴 수 있는데,,


여기서의 printf("%s\n", ptr);는 ptr의 주소 값을 직접적으로 출력하는 것이 아닙니다. 대신, ptr가 가리키는 문자열부터 끝까지를 출력하라는 의미입니다.

C언어에서 문자열은 문자의 연속이며, 널(\0)로 끝납니다. 포인터를 이용해 문자열을 출력할 때, %s 형식 지정자를 사용하면 printf 함수는 주어진 주소부터 시작해서 널 문자를 만날 때까지의 문자들을 출력합니다.

이 코드에서 strchr 함수는 문자 'a'를 처음 발견한 위치의 포인터를 반환합니다. 따라서 printf("%s\n", ptr);는 문자 'a'로 시작하는 부분 문자열부터 문자열의 끝까지 출력하게 됩니다.

예를 들어, 첫 번째로 "a"가 나타나는 위치는 "A Garden Diary"에서 "arden Diary"의 'a'입니다. 따라서 첫 번째 printf는 "arden Diary"를 출력합니다.

간단히 말해, %s는 문자열을 출력하기 위한 형식 지정자이며, 문자열의 시작 주소만 주어지면 해당 주소부터 시작하여 널 문자가 나올 때까지의 문자들을 출력합니다.

 

여기서는 문자열을 출력하기 원하므로 %s와 ptr를 함께 사용하는 것이 올바릅니다.

ptr는 char* 타입입니다. 이 포인터는 strchr 함수에 의해 'a' 문자가 처음으로 발견되는 위치를 가리킵니다. 따라서 printf("%s\n", ptr);를 호출하면 ptr이 가리키는 메모리 위치에서 시작하여 널 종료 문자(\0)가 나올 때까지의 문자열이 출력됩니다.

만약 printf("%s\n", *ptr);를 사용하면 컴파일 오류가 발생합니다. 왜냐하면 *ptr는 char 타입이기 때문입니다. %s 형식 지정자는 char* 타입의 인자를 기대합니다. 문자를 출력하려면 %c 형식 지정자와 *ptr를 사용해야 합니다.

즉, printf("%c\n", *ptr);는 ptr이 가리키는 첫 번째 문자, 즉 'a'만 출력됩니다.

'C' 카테고리의 다른 글

include폴더와 lib폴더와 컴파일과 링킹  (0) 2024.07.25
배열 포인터  (0) 2023.12.13
scanf  (0) 2023.12.12
이중 포인터  (1) 2023.12.12
포인터  (1) 2023.12.12