%s, %c, \0 정리C언어로 문자열을 다루다 보면 %s, %c, 그리고 \0 때문에 헷갈리는 경우가 많다.
처음에는 다 비슷해 보이지만, 실제로는 완전히 다른 개념이다.
%c : 문자 하나 출력%c는 문자 1개(char) 를 출력할 때 사용한다.
#include <stdio.h>
int main() {
char ch = 'A';
printf("%c\n", ch);
return 0;
}
출력:
A
'A', 'b', '1' 같은 한 글자를 출력할 때 사용' ' 사용%s : 문자열 출력%s는 문자열(char 배열) 을 출력할 때 사용한다.
#include <stdio.h>
int main() {
char str[] = "Hello";
printf("%s\n", str);
return 0;
}
출력:
Hello
문자열은 내부적으로 여러 개의 문자가 모여 있는 구조다.
%c와 %s 차이| 구분 | %c | %s |
|---|---|---|
| 대상 | 문자 1개 | 문자열 |
| 자료형 | char | char[] |
| 예시 | 'A' | "ABC" |
%s를 문자에 쓰면 왜 안 되는가char ch = 'A';
printf("%s\n", ch); // 잘못된 코드
이 코드는 정상적으로 동작하지 않는다.
이유는 %s가 문자열의 시작 주소를 기대하기 때문이다.
하지만 ch는 단순히 문자 하나라서 주소가 아니라 값이다.
이 경우 잘못된 메모리를 읽게 되어 프로그램이 비정상적으로 동작할 수 있다.
\0 : 문자열의 끝C언어에서 문자열은 길이를 따로 저장하지 않는다.
그래서 어디까지가 문자열인지 알기 위해 특별한 문자를 사용한다.
그게 바로 \0이다.
'\0'
char str[] = "ABC";
이 코드는 실제로 메모리에 이렇게 저장된다.
'A' 'B' 'C' '\0'
즉, "ABC" 뒤에는 자동으로 \0이 붙는다.
%s의 동작 방식printf("%s", str);
동작 과정은 다음과 같다.
\0을 만나면 멈춤그래서 \0이 없으면 어디까지 출력해야 할지 알 수 없다.
\0이 없을 때 문제char str[] = {'A', 'B', 'C'}; // 잘못된 문자열
printf("%s", str);
이 경우:
%c → 문자 하나 출력%s → 문자열 출력\0 → 문자열 끝을 나타내는 문자C언어에서 문자열은 단순한 char 배열이 아니라
\0으로 끝나는 구조라는 점을 이해하는 것이 중요하다.
처음에는 %s가 그냥 문자열 출력용이라서 문자에도 써도 될 것 같았는데,
실제로는 내부 동작이 다르기 때문에 정확하게 구분해서 써야 한다.
특히 %s는 주소 기반으로 동작한다는 점에서,
포인터 개념과도 연결된다는 걸 알게 됐다.