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", ...)는 단일 단어를 읽는 데 매우 적합하며, 이는 곧 진행할 챌린지에서 연습하게 될 내용입니다.
챌린지
쉬움scanf를 사용하여 사용자로부터 문자열 입력을 받고 이를 다시 표시하는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:
- 사용자의 입력을 저장하기 위해 30개의 요소를 가진
username이라는 이름의 문자 배열을 선언합니다. - 또 다른 입력을 저장하기 위해 25개의 요소를 가진
hobby라는 이름의 문자 배열을 선언합니다. printf를 사용하여 사용자에게 "Enter your username:"이라는 메시지를 출력합니다.%s형식 지정자와 함께scanf를 사용하여username배열에 사용자 이름을 읽어옵니다.printf를 사용하여 사용자에게 "Enter your hobby:"라는 메시지를 출력합니다.%s형식 지정자와 함께scanf를 사용하여hobby배열에 취미를 읽어옵니다.- 아래에 표시된 정확한 형식으로
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를 사용하여 사용자 입력과 형식화된 출력을 결합하는 방법에 대한 이해도를 테스트합니다.
직접 해보기
#include <stdio.h>
int main() {
// TODO: 여기에 문자 배열을 선언하세요
// TODO: 여기에 입력을 요청하고 읽는 코드를 작성하세요
// TODO: 최종 출력 메시지를 인쇄하세요
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.