C 문자열·문자·표준 입출력
문자 배열의 크기와 문자열의 길이를 분리해 계산한다.
실기 학습 목표
문자 배열의 크기와 문자열의 길이를 분리해 계산한다.
핵심 이론
C 문자열은 문자 배열 안에서 널 문자 '\0'까지의 구간이다. char s[]="ABC"는 널 문자를 포함해 4칸이며 strlen(s)는 3이다. sizeof는 해당 식의 자료형 크기를 구한다.
배열이 함수 인수의 포인터로 전달된 뒤 sizeof로 원래 배열 길이를 얻을 수 없다. 문자열 중간의 '\0'은 문자열 길이를 줄이지만 배열 자체의 크기를 바꾸지 않는다.
strcpy는 널 문자까지 복사하며 목적지 공간이 충분해야 한다. strcat은 끝에 이어 붙인다. strcmp는 사전식 비교의 음수·0·양수이며 정확히 -1이나 1이라고 단정하지 않는다.
printf의 %d·%c·%s와 실제 인수형을 대응시킨다. scanf는 저장할 위치를 받으며 %s는 공백에서 멈춘다. 문자열 리터럴 수정은 허용되지 않는 동작이므로 변경 가능한 배열과 구별한다.
문자열은 종료 문자를 만날 때까지 읽는다
C의 문자열은 문자 배열과 마지막 널 문자 \0로 표현된다. char s[]="CODE"는 C·O·D·E·널의 5칸을 차지하지만 strlen(s)는 널 앞의 4를 반환한다. 문자 '0'은 숫자 모양의 문자이고 널 문자와 다르다.
| 인덱스 | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 초기 s | C | O | D | E | \0 |
s[2]='\0' 후 | C | O | \0 | E | \0 |
변경 후 %s로 s를 출력하면 CO다. 뒤의 E가 메모리에서 사라진 것은 아니지만 문자열 출력은 먼저 만난 널에서 멈춘다. s+1부터 출력하면 시작 위치가 인덱스 1로 바뀌므로 O만 나온다.
풀이에서는 ① 배열의 실제 칸을 적고 ② 대입·복사로 바뀐 칸을 갱신한 뒤 ③ 출력 시작 주소부터 널까지 읽는다. 문자열 길이와 배열 전체 크기를 혼동하지 않는다. %c는 한 문자, %s는 문자열을 출력한다. 배열 수용량과 문자열 상수 수정 가능 여부가 불분명한 코드에 대해서는 정상적인 출력값을 억지로 만들지 않는다.
풀이 예시
다음 C17 프로그램이 표준 출력에 기록하는 내용을 쓰시오. 마지막 줄바꿈의 유무는 답안에서 구별하지 않는다. 실행 문자 집합은 ASCII이다.
#include <stdio.h>
#include <string.h>
int main(void) {
char word[] = "MATRIX";
char *p = word + 2;
word[4] = '\0';
printf("%s %zu\n", p, strlen(word));
return 0;
}
예시 정답
TR 4
풀이 과정
word[4]를 널 문자로 바꾸면 문자열은 MATR이다. p는 인덱스 2의 T를 가리키므로 TR을 출력하고, strlen(word)는 4이다.
답안 점검
위 풀이 예시의 답을 가린 뒤, 핵심 이론의 규칙을 적용해 직접 풀어 보세요. 코드와 계산 문제는 중간값·단위·최종 출력의 순서를, 용어 문제는 지문의 핵심 단서와 답의 의미를 점검하세요. 해설과 다른 부분이 있으면 어느 조건을 놓쳤는지 확인하고 연결된 실기 문제로 다시 연습하세요.