C 프로그래밍 문자열: 선언, 초기화, 입출력 마스터하기
C 프로그래밍 문자열
이 튜토리얼은 C 문자열의 기초인 선언, 초기화, 입출력, 함수 사용, 포인터, 필수 라이브러리 함수를 안내합니다.
C에서 문자열은 널 바이트 \0로 끝나는 문자 배열입니다. 예:
char c[] = "c string";
컴파일러는 문자열 리터럴에 자동으로 \0을 추가하여 올바른 C 문자열로 만듭니다.
문자열 선언 방법
문자열은 문자 배열로 선언합니다. 예:
char s[5];
이는 최대 4개 문자와 종료 \0을 담을 수 있는 버퍼를 선언합니다.
문자열 초기화 방법
여러 초기화 스타일이 가능합니다:
char c[] = "abcd";
char c[50] = "abcd";
char c[] = {'a', 'b', 'c', 'd', '\0'};
char c[5] = {'a', 'b', 'c', 'd', '\0'};
버퍼 오버플로 주의: char c[5] = "abcde";는 6개 문자(\0 포함)를 5바이트 배열에 저장하려 하므로 피해야 합니다.
문자열에 값 할당하기
배열은 선언 후 대입할 수 없습니다. 대신 strcpy()를 사용하세요:
char c[100];
strcpy(c, "C programming");
참고: c = "C programming"; 같은 직접 대입은 컴파일 에러를 유발합니다.
사용자로부터 문자열 읽기
공백으로 구분된 입력에는 scanf()를 사용하세요:
#include <stdio.h>
int main() {
char name[20];
printf("이름 입력: ");
scanf("%s", name);
printf("당신의 이름은 %s입니다.", name);
return 0;
}
출력
이름 입력: Dennis Ritchie
당신의 이름은 Dennis입니다.
scanf()는 공백에서 멈추므로 첫 단어만 읽습니다. 배열 이름이 포인터로 변환되므로 name을 직접 전달합니다.
한 줄 전체를 읽으려면?
fgets()와 puts()를 사용하세요:
#include <stdio.h>
int main() {
char name[30];
printf("이름 입력: ");
fgets(name, sizeof(name), stdin);
printf("이름: ");
puts(name);
return 0;
}
출력
이름 입력: Tom Hanks
이름: Tom Hanks
fgets()는 공백을 포함하여 sizeof(name)-1 문자까지 읽습니다. 끝에 개행 문자를 유지하며 puts()가 이를 출력합니다.
참고: gets()는 버퍼 오버플로를 일으킬 수 있어 C 표준에서 폐지되고 제거되었습니다.
함수에 문자열 전달하기
문자열은 배열처럼 함수에 전달됩니다. 예:
#include <stdio.h>
void displayString(char str[]);
int main() {
char str[50];
printf("문자열 입력: ");
fgets(str, sizeof(str), stdin);
displayString(str);
return 0;
}
void displayString(char str[]) {
printf("문자열 출력: ");
puts(str);
}
문자열과 포인터
문자열 이름은 포인터로 변환되어 포인터 연산이 가능합니다:
#include <stdio.h>
int main(void) {
char name[] = "Harry Potter";
printf("%c", *name); // H
printf("%c", *(name+1)); // a
printf("%c", *(name+7)); // o
char *namePtr = name;
printf("%c", *namePtr); // H
printf("%c", *(namePtr+1)); // a
printf("%c", *(namePtr+7)); // o
}
자주 사용하는 문자열 함수
strlen() – 문자열 길이 반환(널 종료 문자 제외).
strcpy() – 한 문자열을 다른 문자열로 복사.
strcmp() – 두 문자열을 사전순으로 비교.
strcat() – 두 문자열을 연결.