강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của maritime233292
maritime233292

câu hỏi đã được viết

(2026) Đỗ kỳ thi Kỹ sư Xử lý Thông tin phần thực hành chỉ trong một tuần

Hàm và hàm đệ quy (v2)

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

Đã giải quyết

Viết

·

23

0

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

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

pythonjavac정보처리기사

Câu trả lời 2

0

weekendcode님의 프로필 이미지
weekendcode
Người chia sẻ kiến thức

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

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

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

Hình ảnh hồ sơ của maritime233292
maritime233292

câu hỏi đã được viết

Đặt câu hỏi