공백을 포함해서 입력받는 동시에, 배열의 길이를 넘는 입력이 들어오더라도 오류가 나지 않고 지정된 길이 만큼만 변수에 저장되는 받는 방법을 소개한다.
첫번째 방법
1. "%숫자[^\n]"
#include <stdio.h>
int main(void) {
char str[20];
printf("도서 이름을 입력하세요 :");
scanf_s("%20[^\n]", str, sizeof(str));
//fgets(str, 19, stdin);
printf("입력하신 도서이름은 %s 입니다.\n", str);
return 0;
}
예를들어 char 배열의 크기가 20인 경우, null문자가 들어갈 공간을 생각해서 그보다 작은 숫자를 지정해주면 아무리 입력이 많이들어와도 딱 그 길이 만큼만 배열에 저장된다. 한글의 경우 2바이트를 차지하니 19보다는 2의 배수인 18로 해주었다.
위 방법은 정규표현식을 아는 사람이라면 익숙할 텐데 [ ]는 어떤 한 문자라는 뜻이고 그 안에 있는 ^는 부정을 뜻하여 [^\n]는 개행을 제외하겠다는 뜻이다.
두번째 방법
2. fgets
#include <stdio.h>
int main(void) {
char str[20];
printf("도서 이름을 입력하세요 :");
//scanf_s("%18[^\n]", str, sizeof(str));
fgets(str, 19, stdin);
printf("입력하신 도서이름은 %s 입니다.\n", str);
return 0;
}
fget는 파일입출력 함수이다. 근데 파일입출력 함수들도 인수로 파일포인터를 주지 않고 표준입출력을 뜻하는 stdin / stdout을 넣었을 때 마치 표준입출력 함수처럼 사용할 수 있다. fgets 함수는 원래 2번째 매개변수인 사이즈-1 만큼 읽어오므로 영어만 읽을거라면 20, 한글포함 입력받으려면 19로 해주면 되겠다.
결과창은 위와 동일하다.
이렇게 입력받은 값은 바로 써도 되고, 아니면 버퍼에 먼저 입력받고 문자열의 길이를 확인해서 이상적인 길이의 문자열이 들어왔을 때만 strcpy로 복사해쓰는 것도 한 방법이다.
'프로그래밍 > C' 카테고리의 다른 글
[ C언어 ] realloc은 얼마나 자주 메모리 주소를 옮길까? (0) | 2022.05.02 |
---|---|
[ C언어 ] scanf의 리턴값 (0) | 2022.04.27 |
scanf , scanf_s " %d "로 정수 입력 받으려다 문자(열)이 잘못 들어왔을 때 무한루프에 빠지는 문제 / 문장 씹히는 문제 해결 (0) | 2022.04.27 |
[ C언어 ] enum 의 활용 + 사용예제 (0) | 2022.04.26 |
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (4) - 파일 입출력 - fopen / fopen_s, .bin 바이너리 파일 읽기 / 쓰기 (0) | 2022.04.25 |