안녕하세요 omyo 입니다. 이번 포스팅에서는, 공백 문자를 포함한 문자열을 입력받는 2가지 방법에 대해서 소개해 드리려고 합니다.
scanf("%s",문자열) 을 이용해서 문자열을 받으면, scanf는 공백을 문자열의 끝으로 인식하기 때문에 공백 문자 뒤의 내용이 모두 잘리게 됩니다.
예를들어 다음 코드에 "Hello C World" 문자열을 입력하면 Hello 공백 뒤의 C World 문자열이 모두 잘립니다.
#include <stdio.h>
#define LEN 1000000
int main(void){
char str[LEN];
scanf("%s",str);
printf("%s",str);
}
1> scanf[] scanset character
scanf("%[^\n]s", str)
scanset character [] 를 scanf 함수에 추가해 주는 방법입니다.
[^"문자"]의 의미는 해당 문자가 나오기 전 까지 모든 문자열을 받겠다는 뜻 입니다.
개행(엔터)를 의미하는 문자인 "\n" 를 ^뒤에 넣어주면, 개행(엔터)가 나오기 전 까지 모든 문자열을 받겠다는 뜻이 됩니다. 따라서, 공백도 포함해서 입력을 받을 수 있게 되는 것이죠.
/* scanset character 예시 */
#include <stdio.h>
#define LEN 1000000
int main(void){
char str[LEN];
scanf("%[^\n]s",str);
printf("%s",str);
}
다른 방식으로 응용해 봅시다.
scanf("%[^abc]", str) ; a or b or c 문자가 나오기 전까지 모든 문자열을 버퍼에 저장합니다.
입력값 : 12345a1234
버퍼(저장)값 : 12345
scanf("%[abc]", str) ; a or b or c 문자 "이외의 값" 이 나오기 전까지 모든 문자열을 버퍼에 저장합니다.
입력값 : abcabcd
버퍼(저장)값 : abcabc
scanf("%5[abc]", str) ; a or b or c 문자 "이외의 값" 이 나오기 전까지 모든 문자열을 "5자리 까지" 버퍼에 저장합니다.
입력값 : aaabbbccc
버퍼(저장)값 : aaabb
2> fgets() Function
함수원형 : char* fgets(char* str, int num, FILE* pFile);
사용 예시 : fgets("문자열", 100, stdin)
함수 이름인 fgets 는 file + get + string 을 조합한 이름으로, 파일로 부터 문자열을 가지고 온다는 뜻입니다.
단, scanf 함수와 달리 fgets 함수는 공백을 포함하여 문자열을 입력 받습니다.
첫 번째 인자 : 문자열을 가리키는 포인터 입니다.
두 번째 인자 : 문자열의 길이를 넣는 변수 입니다.
세 번째 인자 : 파일을 가리키는 파일 포인터 입니다.
/* fgets 예시 */
#include <stdio.h>
#define LEN 1000000
int main(void){
char str[LEN];
fgets(str,LEN,stdin);
printf("%s",str);
}
scanf와 비교해 보면 속도가 약간 더 빠르네요.
'Programming > C,C++' 카테고리의 다른 글
[C언어] C언어의 메모리 구조 ; 데이터(Data)/스택(Stack)/힙(Heap) 영역 (0) | 2021.02.07 |
---|---|
[C++] #5 참조자(Reference)와 함수 (0) | 2021.01.02 |
[C++] #4 참조자(Reference) (0) | 2021.01.02 |
[C++] #3 이름공간(Name Space)의 사용방법 (0) | 2020.12.23 |
[C++] #2 함수 오버로딩(Function Overloading)과 디폴트 값(Default Value) (0) | 2020.12.22 |
댓글