Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- graph
- Python
- 생활코딩
- greedy
- JavaScript
- dfs
- 인프런
- BOJ
- C언어
- Algospot
- 따라하며 배우는 C언어
- server
- 정수론
- BFS
- Math
- String
- Algorithm
- Cleancode
- 종만북
- web
- 따배씨
- BASIC
- programmers
- sorting
- C
- php
- udemy
- DP
- 따라하면서 배우는 C언어
- 백준
Archives
- Today
- Total
몽상실현개발주의
[따배씨] 11.4 문자열을 입력받는 다양한 방법들 본문
따배씨 - 따라하며 배우는 C언어
11강 문자열 함수들
11.4 문자열을 입력받는 다양한 방법들
- 입력받은 메모리 공간을 확보한 다음에 입력을 받아야 함
#include <stdio.h>
#define STRLEN 81
int main(){
char words[STRLEN] = "";
gets(words);
// Hello words
printf("START\n");
// START
printf("%s", words);
puts(words);
// Hello wordsHello words
puts("END.");
// END.
return 0;
}
char words[STRLEN] = "";
gets(words);
- gets 함수는 String 의 첫 주소를 받아서 출력
- 포인터 하나만 받아서는 사용할 메모리의 크기를 알 수 없음
- 시작점만 알고 끝나는 메모리 주소를 모르는 상태
- 포인터 하나를 argument 로 받는 함수들이 겪는 공통된 문제
gets_s(words, sizeof(words));
- C11 표준에서, pointer 와 size 를 같이 받아 주는 함수를 지원
#include <stdio.h>
int main(){
char words[5] = "";
gets(words);
// abcdefghijklmn // 5 보다 긴 문자열 입력
printf("START\n");
printf("%s", words);
puts(words);
puts("END.");
return 0;
}
char words[5] = "";
gets(words);
// abcdefghijklmn // 5 보다 긴 문자열 입력
- Runtime Error 발생
char words[5] = "";
fgets(words, sizeof(words), stdin);
// abcdefghijklmn // 5 보다 긴 문자열 입력
fgets 는 읽어 들이는 데이터가 언제 끝날지 모른다는것을 염두해두기 때문에 더 긴 문자열을 입력하여도 처리 가능
- 단, 설정한 문자열의 길이만큼만 처리
- fgets 는 '\n' 를 제거하지 않고 그대로 읽어들임, 파일 입출력의 특징
- stdin 을 통해서 standard 입력으로 사용하여 '\n' 을 마지막 입력으로 받아주고 입력을 종료
- '\n' 을 '\0'(Null Character) 으로 변경하지 않으면 출력시 줄바꿈 까지 출력되는것을 주의
- 긴 문자열을 입력시에는 마지막 Null character 공간을 고려하여 저장됨
char words[5] = "";
fgets(words, sizeof(words), stdin);
// abcdefghijklmn
// words = "abcd\0"
- fgets 의 return 값
- 정상 입력시, 입력받은 포인터
- EOF 입력(파일의 끝)시, NULL Character
fputs(words, stdout);
- fputs 는 파일 출력, stdout 을 이용하여 standard 출력으로 사용 가능
#include <stdio.h>
int main(){
char small_array[5];
puts("Enter long strings:");
while (fgets(small_array, 5, stdin) != NULL & small_array[0] != '\n'){
fputs(small_array, stdout);
}
return 0;
}
- Buffer 를 이용하여, 작은 공간에 입력 받았지만 한번에 입력 받은 것 처럼 출력 동작
#include <stdio.h>
int main(){
char str1[6], str2[6];
int count = scanf("%5s %5s", str1, str2);
// 123456789012345
printf("%s|%s\n", str1, str2);
// 12345|67890
return 0;
}
- %5s, 입력 글자수를 5자로 제한하여 긴 입력을 잘라서 입력 받음
#include <stdio.h>
int main(){
char str1[6], str2[6];
int count = scanf("%6s %6s", str1, str2);
// 123456789012345
printf("%s|%s\n", str1, str2);
// |789012
return 0;
}
- %6s, String 을 선언한 공간보다 큰 입력을 받으려고 하면 비정상 동작
char* custom_string_input(char* st, int n){
char* ret_ptr;
int i = 0;
ret_ptr = fgets(st, n, stdin);
if (ret_ptr){
while (st[i] != '\n' && st[i] != '\0')
i++;
if (st[i] == '\n')
st[i] = '\0';
else
while (getchar() != '\n') // clear buffer
continue;
}
return ret_ptr;
}
- 문자열 입력함수를 만들어서 사용 가능
- 그럴 일은 없다
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
http://blog.naver.com/atelierjpro
http://www.inflearn.com/course/following-c
'Language > C' 카테고리의 다른 글
[따배씨] 11.6 다양한 문자열 함수들 (0) | 2021.06.09 |
---|---|
[따배씨] 11.5 문자열을 출력하는 다양한 방법들 (0) | 2021.06.09 |
[따배씨] 11.3 문자열의 배열 (0) | 2021.06.09 |
[따배씨] 11.2 메모리 레이아웃과 문자열 (0) | 2021.06.09 |
[따배씨] 11.1 문자열을 정의하는 방법들 (0) | 2021.06.09 |
Comments