[C/C++] C 언어에서 공백을 포함한 문자열 입력 받기: 'scanf'와 'fgets' 활용법

[C/C++] C 언어에서 공백을 포함한 문자열 입력 받기: 'scanf'와 'fgets' 활용법

C
민호이 민호이 2025. 1. 25. 01:43
목차
  1. 1. 문제 개요
  2. 2. scanf를 활용한 공백 처리
  3. 2.1 기본 scanf의 제한
  4. 2.2 %[^\n] 형식을 사용한 개선
  5. 3. fgets로 더 안전한 입력 받기
  6. 3.1 fgets의 장점
  7. 3.2 scanf와 fgets 비교
  8. 4. 실전 코드: 사용자 입력 받기 함수화
  9. 예제:
  10. 출력:
  11. 5. 결론

C 언어에서 공백을 포함한 문자열 입력 받기: scanf와 fgets 활용법

1. 문제 개요

C 언어의 scanf는 문자열을 입력받을 때 기본적으로 공백을 기준으로 데이터를 구분합니다. 사용자가 이름처럼 공백이 포함된 문자열을 입력할 경우, scanf는 첫 번째 단어까지만 읽고 이후의 데이터는 무시합니다.
이번 글에서는 scanf로 공백을 포함한 문자열을 읽는 방법과, 이를 대체할 수 있는 fgets의 안전하고 효율적인 사용법을 소개합니다.


2. scanf를 활용한 공백 처리

2.1 기본 scanf의 제한

scanf는 %s 형식을 사용할 때 공백을 만나는 즉시 입력을 종료합니다. 따라서, "Lucas Aardvark"라는 이름을 입력하면 "Lucas"만 읽히고, 나머지는 무시됩니다.

예제:

#include <stdio.h>
int main() {
char name[256];
printf("What is your name? ");
scanf("%s", name);
printf("Hello %s. Nice to meet you.\n", name);
return 0;
}

입력:

Lucas Aardvark

출력:

Hello Lucas. Nice to meet you.

2.2 %[^\n] 형식을 사용한 개선

scanf에서 %[^\n] 형식을 사용하면, 입력된 데이터에서 개행 문자(\n)를 만나기 전까지 모든 문자를 읽을 수 있습니다. 이를 활용해 공백이 포함된 문자열을 읽어들일 수 있습니다.

수정된 예제:

#include <stdio.h>
int main() {
char name[256];
printf("What is your name? ");
scanf("%255[^\n]", name); // 최대 255문자까지 읽기 (버퍼 크기 - 1)
printf("Hello %s. Nice to meet you.\n", name);
return 0;
}

출력:

What is your name? Lucas Aardvark
Hello Lucas Aardvark. Nice to meet you.

주의사항:

  • %255[^\n]는 입력 버퍼 오버플로우를 방지하기 위해 사용됩니다. 255는 버퍼 크기에서 널 종결 문자(\0)를 위한 공간을 제외한 크기입니다.
  • 입력 데이터의 크기가 제한을 초과하면, 초과된 데이터가 입력 버퍼에 남아 이후 입력 처리에 영향을 줄 수 있습니다.

3. fgets로 더 안전한 입력 받기

3.1 fgets의 장점

fgets는 입력 데이터의 크기를 제한할 수 있어, 버퍼 오버플로우를 방지하는 데 효과적입니다. 또한, 개행 문자(\n)를 포함하여 한 줄 전체를 읽습니다.

예제:

#include <stdio.h>
#include <string.h>
int main() {
char name[256];
printf("What is your name? ");
fgets(name, sizeof(name), stdin); // 버퍼 크기를 지정하여 입력 받음
// 개행 문자 제거
name[strcspn(name, "\n")] = '\0';
printf("Hello %s. Nice to meet you.\n", name);
return 0;
}

출력:

What is your name? Lucas Aardvark
Hello Lucas Aardvark. Nice to meet you.

3.2 scanf와 fgets 비교

항목 scanf fgets
공백 포함 문자열 기본적으로 지원하지 않음 공백 포함 문자열 입력 가능
버퍼 오버플로우 방지 %[^\n] 사용 시 가능 기본적으로 버퍼 크기 지정 가능
개행 문자 처리 수동으로 처리해야 함 자동으로 개행 문자를 포함하여 읽음
사용 편의성 상대적으로 복잡 더 간단하고 안전

4. 실전 코드: 사용자 입력 받기 함수화

입력을 받을 때마다 코드를 반복 작성하는 대신, 입력 처리를 위한 함수를 만들어 재사용성을 높일 수 있습니다.

예제:

#include <stdio.h>
#include <string.h>
void getInput(const char *prompt, char *buffer, size_t size) {
printf("%s", prompt);
if (fgets(buffer, size, stdin)) {
buffer[strcspn(buffer, "\n")] = '\0'; // 개행 문자 제거
}
}
int main() {
char name[256];
getInput("What is your name? ", name, sizeof(name));
printf("Hello %s. Nice to meet you.\n", name);
return 0;
}

출력:

What is your name? Lucas Aardvark
Hello Lucas Aardvark. Nice to meet you.

5. 결론

  • scanf는 기본적으로 공백이 포함된 문자열 입력에 적합하지 않지만, %[^\n] 형식을 활용하면 해결할 수 있습니다.
  • 버퍼 오버플로우 방지와 안전성을 고려한다면, fgets가 더 나은 선택입니다.
  • 사용자 입력 처리를 함수화하여 코드의 재사용성과 가독성을 높일 수 있습니다.

C 언어에서 안전하고 효율적으로 문자열을 입력받으려면, fgets와 같은 안전한 함수 사용을 고려하세요.

 

저작자표시 비영리 변경금지 (새창열림)
  1. 1. 문제 개요
  2. 2. scanf를 활용한 공백 처리
  3. 2.1 기본 scanf의 제한
  4. 2.2 %[^\n] 형식을 사용한 개선
  5. 3. fgets로 더 안전한 입력 받기
  6. 3.1 fgets의 장점
  7. 3.2 scanf와 fgets 비교
  8. 4. 실전 코드: 사용자 입력 받기 함수화
  9. 예제:
  10. 출력:
  11. 5. 결론
'C' 카테고리의 다른 글
  • [C/C++] C++에서 CPU 사이클 카운트 측정: __rdtsc와 플랫폼별 구현법
  • [C/C++] C에서 Enter 없이 키 입력 처리하기: getch와 termios로 구현
  • [C/C++] C에서 다차원 배열을 동적으로 할당하는 올바른 방법
  • [C/C++] C언어에서 배열 Decay란? 포인터 변환의 원리와 주의사항
민호이
민호이
민호이
ChungCODE
민호이
전체
오늘
어제
  • Categories (128)
    • 스포츠 (6)
    • 인공지능 (5)
    • 주식 (6)
      • 경제 주식 전망 (5)
      • ETF (9)
    • CSAPP (4)
      • Lab Session (4)
      • Concepts (0)
    • C (19)
    • Java (24)
    • Rust (44)
      • Concepts (27)
      • Libraries (17)
    • PS (2)
    • 국내 소식 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 유클리드 호제법
  • 수학
  • 알고리즘
  • 최소공배수
  • c++
  • C
  • 최대공약수
  • 코드업

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.v4.2.1
민호이
[C/C++] C 언어에서 공백을 포함한 문자열 입력 받기: 'scanf'와 'fgets' 활용법
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.