강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

maritime23님의 프로필 이미지
maritime23

작성한 질문수

(2026) 일주일만에 합격하는 정보처리기사 실기

함수와 재귀함수 (v2)

섹션 3. 17강. 23:00 질문 있습니다.

해결된 질문

작성

·

17

0

  • 섹션 3. 17강. 23:00 질문 있습니다.

  • printf("입력된 문자열: %s\n", str); 이 아니라 printf("입력된 문자열: %c\n", str)라면 어떤식으로 출력이 될까요? myString[]에서 this is string은 알파벳 하나하나 주소를 갖는건가요? 아니면 통째로 주소를 갖는 건가요?ㅜ 갑자기 헷갈려서 남깁니다.

답변 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은 이 문자들이 시작하는 주소를 가리킵니다.

이해를 돕기 위해 관련된 질문과 답변을 확인해 보시길 권장드립니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

maritime23님의 프로필 이미지
maritime23

작성한 질문수

질문하기