Menu
Coddy logo textTech

scanf를 이용한 문자열 입력

Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 14번째.

이제 널 종료 문자(null terminator)와 함께 문자열이 어떻게 작동하는지 이해했으므로, 사용자로부터 문자열 입력을 받는 방법을 배울 차례입니다. scanf 함수는 %s 형식 지정자를 사용하여 문자열을 읽을 수 있지만, 이해해야 할 중요한 제한 사항이 있습니다.

scanf로 문자열을 읽으려면, %s 형식을 사용하고 문자 배열의 이름을 전달합니다 (배열 이름은 이미 주소이므로 & 연산자 없이):

char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);

하지만 scanf("%s", ...)에는 치명적인 한계가 있습니다. 공백 문자(공백, 탭 또는 줄바꿈)를 만나는 즉시 읽기를 중단한다는 점입니다. 즉, 사용자가 "Hello World"를 입력하면 scanf는 "Hello"만 캡처하고 "World"는 입력 버퍼에 남겨둡니다.

또 다른 심각한 문제는 scanf가 입력이 배열의 크기에 맞는지 확인하지 않는다는 점입니다. 만약 누군가가 배열이 수용할 수 있는 것보다 더 긴 단어를 입력하면, 버퍼 오버플로우(buffer overflow)가 발생하여 잠재적으로 프로그램이 중단되거나 보안 취약점이 발생할 수 있습니다. 항상 문자 배열이 예상되는 입력을 충분히 담을 수 있을 만큼 큰지 확인하십시오.

이러한 제한 사항에도 불구하고, scanf("%s", ...)는 단일 단어를 읽는 데 매우 적합하며, 이는 곧 진행할 챌린지에서 연습하게 될 내용입니다.

challenge icon

챌린지

쉬움

scanf를 사용하여 사용자로부터 문자열 입력을 받고 이를 다시 표시하는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:

  1. 사용자의 입력을 저장하기 위해 30개의 요소를 가진 username이라는 이름의 문자 배열을 선언합니다.
  2. 또 다른 입력을 저장하기 위해 25개의 요소를 가진 hobby라는 이름의 문자 배열을 선언합니다.
  3. printf를 사용하여 사용자에게 "Enter your username:"이라는 메시지를 출력합니다.
  4. %s 형식 지정자와 함께 scanf를 사용하여 username 배열에 사용자 이름을 읽어옵니다.
  5. printf를 사용하여 사용자에게 "Enter your hobby:"라는 메시지를 출력합니다.
  6. %s 형식 지정자와 함께 scanf를 사용하여 hobby 배열에 취미를 읽어옵니다.
  7. 아래에 표시된 정확한 형식으로 printf를 사용하여 두 문자열을 출력합니다.

입력은 두 개의 별개 단어로 제공됩니다 (각 단어 내에 공백은 없습니다).

출력은 다음과 같은 형식으로 표시되어야 합니다:

Enter your username:
Enter your hobby:
Hello [username], your hobby is [hobby]!

예를 들어, 사용자가 사용자 이름으로 "Alice"를 입력하고 취미로 "reading"을 입력하면 출력은 다음과 같아야 합니다:

Enter your username:
Enter your hobby:
Hello Alice, your hobby is reading!

이 챌린지는 %s 형식 지정자와 함께 scanf를 사용하여 문자열 입력을 읽는 방법, 충분한 크기의 적절한 문자 배열 선언, 그리고 printf를 사용하여 사용자 입력과 형식화된 출력을 결합하는 방법에 대한 이해도를 테스트합니다.

치트 시트

사용자로부터 문자열 입력을 읽으려면 %s 형식 지정자와 함께 scanf를 사용하세요:

char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);

scanf("%s", ...)의 중요한 제한 사항:

  • 공백 문자(공백, 탭, 줄바꿈)에서 읽기를 중단합니다.
  • 단일 단어만 캡처합니다 - "Hello World"는 "Hello"가 됩니다.
  • 버퍼 오버플로 방지 기능이 없습니다 - 배열이 충분히 큰지 확인하세요.
  • 배열 이름에 & 연산자를 사용하지 마세요 (배열 이름은 이미 주소입니다).

직접 해보기

#include <stdio.h>

int main() {
    // TODO: 여기에 문자 배열을 선언하세요
    
    // TODO: 여기에 입력을 요청하고 읽는 코드를 작성하세요
    
    // TODO: 최종 출력 메시지를 인쇄하세요
    
    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Logic & Flow의 모든 레슨