C 언어의 문자열: 초보자 가이드

안녕하세요, 미래의 프로그래머 여러분! 오늘 우리는 C 언어의 문자열 세계로 흥미로운 여정을 떠납니다. 프로그래밍에 전혀 익숙하지 않으신 분들도 걱정 마세요 - 저는 여러분의 친절한 안내자가 되겠습니다. 우리는 단계별로 진행하겠습니다. 이 튜토리얼이 끝나면 여러분은 C 언어에서 프로처럼 문자열을 다룰 수 있을 것입니다!

C - Strings

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