C 언어의 문자열: 초보자 가이드
안녕하세요, 미래의 프로그래머 여러분! 오늘 우리는 C 언어의 문자열 세계로 흥미로운 여정을 떠납니다. 프로그래밍에 전혀 익숙하지 않으신 분들도 걱정 마세요 - 저는 여러분의 친절한 안내자가 되겠습니다. 우리는 단계별로 진행하겠습니다. 이 튜토리얼이 끝나면 여러분은 C 언어에서 프로처럼 문자열을 다룰 수 있을 것입니다!
C 언어에서 문자열이란?
초보적인 것부터 시작해보겠습니다. C 언어에서 문자열은 본질적으로 문자의 시퀀스입니다. 목걸이를 생각해보세요. 각 보석이 문자 하나하나입니다. 이 문자들은 연속된 메모리 위치에 저장되며, 특별한 문자인 null 문자('\0')로 끝납니다.
흥미로운 사실 하나: C 언어에서는 문자열에 대한 별도의 데이터 타입이 없습니다. 대신, 문자 배열을 사용하여 문자열을 표현합니다. 우체통의 행을 사용하여 편지 시리즈를 저장하는 것과 같은 이야기입니다!
C 언어에서 문자열 만들기
이제 손을 땅에 대고 우리의 첫 번째 문자열을 만들어보겠습니다. 여러 가지 방법이 있지만, 가장 간단한 방법으로 시작해보겠습니다:
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
이 예제에서 우리는 "Hello"라는 단어를 포함하는 greeting
문자열을 만들었습니다. 이를 해부해보겠습니다:
-
char
은 문자의 데이터 타입입니다. -
greeting
은 우리의 문자열의 이름입니다. -
[6]
은 우리의 배열의 크기를 지정합니다. "Hello"에 5개의 공간과 null 문자에 1개의 공간이 필요합니다. - 문자는 단일 따옴표로 둘러싸여 있으며 쉼표로 구분됩니다.
- null 문자
'\0'
을 마지막에 잊지 마세요!
배열 크기 지정 없이 문자열 초기화
C는 문자열의 크기를 우리 대신 계산할 수 있습니다. 이를 확인해보세요:
char greeting[] = "Hello";
이게 멋지지 않나요? C는 자동으로 null 문자를 추가하고 크기를 계산합니다. 마법처럼 보이지만, 그저 C가 효율적일 뿐입니다!
문자열을 순회하다
이제 문자열이 있으니, 그것을 순회하는 방법을 배워보겠습니다. 각 문자를 개별적으로 처리하고 싶을 때 이는 유용합니다:
#include <stdio.h>
int main() {
char greeting[] = "Hello";
int i = 0;
while (greeting[i] != '\0') {
printf("%c", greeting[i]);
i++;
}
return 0;
}
이 코드는 "Hello"의 각 문자를 하나씩 출력합니다. 루프는 null 문자에 도달할 때까지 계속됩니다. null 문자는 문자열의 끝을 알리는 신호입니다.
문자열 출력 (%s 형식 지시자 사용)
문자열을 문자 단위로 순회하는 것은 재미있지만, 더 쉬운 방법이 있습니다:
#include <stdio.h>
int main() {
char greeting[] = "Hello, World!";
printf("%s", greeting);
return 0;
}
%s
형식 지시자는 printf
에게 문자열이 오는 것을 알리는 신호입니다. "안녕, 문자열이 왔어!"라고 말하는 것과 같습니다!
더블 따옴표를 사용하여 문자열 구성
우리의 첫 번째 예제에서 문자열을 문자 단위로 만드는 것을 보았습니다. 그러나 더 간단한 방법이 있습니다:
char greeting[] = "Hello, World!";
이 것은 우리의 이전 예제와 같은 일을 하지만, 더 간결합니다. C는 자동으로 null 문자를 추가합니다. 목걸이를 미리 꿰어놓은 것처럼입니다!
scanf()
를 사용하여 문자열 입력
이제 사용자로부터 입력을 받아 프로그램을 상호작용적으로 만들어보겠습니다:
#include <stdio.h>
int main() {
char name[50];
printf("이름을 입력하세요: ");
scanf("%s", name);
printf("안녕하세요, %s!\n", name);
return 0;
}
여기서 우리는 scanf()
를 사용하여 사용자로부터 문자열을 읽습니다. 하지만 조심하세요! scanf()
는 공백이 나타나는 첫 번째 위치에서 읽기를 중단합니다. 따라서 "John Doe"을 입력하면 "John"만 name
에 저장됩니다.
공백을 포함한 문자열 입력
공백을 포함한 문자열을 읽기 위해 다음과 같은 형식 지시자를 scanf()
와 함께 사용할 수 있습니다:
#include <stdio.h>
int main() {
char fullName[100];
printf("전체 이름을 입력하세요: ");
scanf("%[^\n]s", fullName);
printf("안녕하세요, %s!\n", fullName);
return 0;
}
%[^\n]s
형식 지시자는 scanf()
가 개행 문자를 만날 때까지 읽도록 합니다. 이렇게 하면 공백이 포함된 전체 이름이나 문장을 읽을 수 있습니다.
gets()
와 fgets()
함수를 사용하여 문자열 입력
gets()
함수는 간단하지만 안전하지 않기 때문에 사용을 피하는 것이 좋습니다. 그 대신 더 안전한 fgets()
함수를 사용하세요:
#include <stdio.h>
int main() {
char sentence[100];
printf("문장을 입력하세요: ");
fgets(sentence, sizeof(sentence), stdin);
printf("입력하신 내용: %s", sentence);
return 0;
}
fgets()
은 최대 읽을 문자 수를 지정할 수 있어 버퍼 오버플로를 방지하는 데 유용합니다.
puts()
와 fputs()
함수를 사용하여 문자열 출력
마지막으로, 문자열을 출력하는 몇 가지 대안적인 방법을 살펴보겠습니다:
#include <stdio.h>
int main() {
char greeting[] = "Hello, World!";
puts(greeting); // `puts()`은 자동으로 개행을 추가합니다
fputs(greeting, stdout); // `fputs()`은 개행을 추가하지 않습니다
return 0;
}
puts()
은 간단하고 자동으로 개행을 추가합니다. 반면 fputs()
은 출력에 대한 더 많은 제어를 제공합니다.
이 표는 우리가 다룬 문자열 함수를 요약합니다:
함수 | 목적 | 예제 |
---|---|---|
scanf() |
포맷된 입력 읽기 | scanf("%s", str); |
gets() |
줄 읽기 (안전하지 않음, 사용하지 마세요) | gets(str); |
fgets() |
안전하게 줄 읽기 | fgets(str, size, stdin); |
printf() |
포맷된 출력 | printf("%s", str); |
puts() |
문자열 출력 (개행 포함) | puts(str); |
fputs() |
문자열 출력 (개행 미포함) | fputs(str, stdout); |
이제 여러분은 C 언어의 문자열에 대한 첫 걸음을 뗐습니다. 연습이 완벽을 이루는 열쇠입니다. 이 개념을 실험해보세요. 행복한 코딩 되세요, 그리고 여러분의 문자열이 항상 null-텅 비게 되길 바랍니다!
Credits: Image by storyset