scanf를 이용한 문자열 입력
Coddy C 여정의 논리 & 흐름 섹션에 포함된 레슨. 63개 중 14번째.
문자열이 널 종료 문자와 함께 작동하는 방식을 이해했으니, 이제 사용자로부터 문자열 입력을 받는 방법을 배울 차례입니다. 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가 입력값이 배열에 들어가는지 확인하지 않는다는 점입니다. 배열이 담을 수 있는 것보다 긴 단어를 입력하면 버퍼 오버플로가 발생하여 프로그램이 충돌하거나 보안 취약점이 생길 수 있습니다. 예상되는 입력을 담을 수 있을 만큼 문자 배열을 항상 충분히 크게 만드세요.
이러한 제한에도 불구하고 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;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
논리 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러