인프런 커뮤니티 질문&답변
섹션 3. 17강. 23:00 질문 있습니다.
해결된 질문
작성
·
17
답변 2
0
printf("입력된 문자열: %c\n", str)
%c는 문자 그 자체를 출력하는 포맷이고, 주소가 오면 안됩니다.
배열의 이름 그 자체는 배열의 시작 주소를 가집니다. str은 뜯어보면 메모리 주소라는 것이죠.
그래서 결론적으로는 오류가 발생합니다.
그런 코드는 시험 문제에서 출제되지 않습니다.
#include <stdio.h>
int main() {
char str[] = "this is string";
printf("=== 1. %%s와 %%c의 차이 ===\n");
printf("%%s로 출력: %s\n", str);
printf("%%c로 출력: %c\n", str); // ⚠️ 경고 발생! 이상한 문자 출력됨
printf("\n");
printf("=== 2. 올바른 %%c 사용법 ===\n");
printf("첫 번째 문자만 출력: %c\n", str[0]); // 't' 출력
printf("두 번째 문자만 출력: %c\n", str[1]); // 'h' 출력
printf("\n");
printf("=== 3. 메모리 주소 확인 ===\n");
printf("배열 이름(첫 번째 요소 주소): %p\n", str);
printf("str[0]의 주소: %p\n", &str[0]);
printf("str[1]의 주소: %p\n", &str[1]);
printf("str[2]의 주소: %p\n", &str[2]);
printf("str[3]의 주소: %p\n", &str[3]);
printf("\n");
printf("=== 4. 각 문자 값과 주소 출력 ===\n");
for (int i = 0; str[i] != '\0'; i++) {
printf("str[%d] = '%c', 주소: %p\n", i, str[i], &str[i]);
}
printf("\n");
printf("=== 5. 주소 차이 확인 ===\n");
printf("str[0]과 str[1]의 주소 차이: %ld 바이트\n",
(long)(&str[1] - &str[0]));
return 0;
}
온라인 컴파일러 기준으로 아래 출력문이 나옵니다.
메모리 주소는 환경에 따라 다르게 나오니까 무시하시고, 값만 보시면 됩니다.
=== 1. %s와 %c의 차이 ===
%s로 출력: this is string
%c로 출력: �
=== 2. 올바른 %c 사용법 ===
첫 번째 문자만 출력: t
두 번째 문자만 출력: h
=== 3. 메모리 주소 확인 ===
배열 이름(첫 번째 요소 주소): 0x7ffdca154b9d
str[0]의 주소: 0x7ffdca154b9d
str[1]의 주소: 0x7ffdca154b9e
str[2]의 주소: 0x7ffdca154b9f
str[3]의 주소: 0x7ffdca154ba0
=== 4. 각 문자 값과 주소 출력 ===
str[0] = 't', 주소: 0x7ffdca154b9d
str[1] = 'h', 주소: 0x7ffdca154b9e
str[2] = 'i', 주소: 0x7ffdca154b9f
str[3] = 's', 주소: 0x7ffdca154ba0
str[4] = ' ', 주소: 0x7ffdca154ba1
str[5] = 'i', 주소: 0x7ffdca154ba2
str[6] = 's', 주소: 0x7ffdca154ba3
str[7] = ' ', 주소: 0x7ffdca154ba4
str[8] = 's', 주소: 0x7ffdca154ba5
str[9] = 't', 주소: 0x7ffdca154ba6
str[10] = 'r', 주소: 0x7ffdca154ba7
str[11] = 'i', 주소: 0x7ffdca154ba8
str[12] = 'n', 주소: 0x7ffdca154ba9
str[13] = 'g', 주소: 0x7ffdca154baa
=== 5. 주소 차이 확인 ===
str[0]과 str[1]의 주소 차이: 1 바이트0
안녕하세요, 인프런 AI 인턴입니다. maritime23님.
C 언어에서 printf 함수에서 사용되는 %c와 %s는 문자열 출력 방식에 있어 차이가 있습니다. printf("입력된 문자열: %s\n", str);는 str이 가리키는 문자열을 널(‘\0’) 문자를 만날 때까지 출력합니다. 반면에 printf("입력된 문자열: %c\n", str);를 사용하면, str이 가리키는 첫 번째 문자만을 출력하게 됩니다. 이는 str 배열의 첫 번째 문자의 값을 출력하는 것과 같습니다.
그러므로 만약 myString[]이 문자열 "this is string"을 담고 있다면, %s는 “this is string” 전체를 출력하고, %c는 문자열의 첫 번째 문자 ’t’만을 출력하게 됩니다. 이와 같은 방식으로 C에서는 문자열의 각 문자가 개별적으로 메모리에 저장되며, str은 이 문자들이 시작하는 주소를 가리킵니다.
이해를 돕기 위해 관련된 질문과 답변을 확인해 보시길 권장드립니다:
- 포인터를 입력값으로 받는 변수(질문 예시)에서 포인터와 문자열 출력 방식에 대해 다룹니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




