개인노트
[C언어] 문자열 단위의 입출력 함수 본문
▶ 문자열 단위 출력 함수 - puts, fputs ◀
#include <stdio.h> int puts(const char * s); // 기본 출력 대상은 stdout int fputs(const char * s, FILE * stream); // 기본 출력 대상을 지정할 수 있다. → puts과 fputs는 문자열을 입력 받아야 하기 때문에 포인터 변수를 사용한다. → 성공 시 0이 아닌 값을 반환, 실패 시 EOF 반환 |
puts 함수와 fputs 함수는 문자열을 출력해주는 함수이지만 서로 다른점이 있다. 밑의 컴파일 결과를 보자.
puts 함수와 달리 fputs 함수는 개행을 위한 printf함수를 출력하고 있다. puts 함수는 자동 개행이 되지만 fputs 함수는
그렇지 않다.
[ 예제 ]
#include <stdio.h> #include <stdlib.h> int main() { char a[]= "BILLNAIRK IS GOOD MAN"; // 배열이름 = 포인터 변수 char * b = "Today is So hot";
puts(a); puts(b); puts("C O M P U T E R"); printf("\n"); fputs(a, stdout); printf("\n"); fputs(b, stdout); printf("\n"); fputs("C O M P U T E R", stdout); printf("\n"); } |
▶ 문자열 단위 입력 함수 - gets_s, fgets ◀
#include <stdio.h> char * gets_s(char * s, buffer size); // gets 함수는 보안상의 이유로 사라졌다. char * fgets(char * s, int n , FILE * stream); → EOF에 도달하거나 함수 호출 실패 시 NULL 포인터 반환 |
[ gets_s 사용법 ]
#include <stdio.h> int main(void) { char a[10]; gets_s(a,sizeof(a)); // sizeof(배열이름) 대신 배열의 크기를 넣어도 된다. // 배열의 크기보다 많이 입력하면 에러 발생!! printf("출력\n"); fputs(a,stdout); printf("\n"); } |
[ fgets 사용법 ]
fgets는 gets_s와는 달리 배열에 지정된 크기보다 큰 값을 주게되면 뒷 부분이 짤려서 나온다.
Tistory B까지만 출력된 이유는 공백도 하나의 문자로 포함이 되고 맨 뒷부분에는 NULL문자가 저장이 되기 때문이다.
문자와 문자열의 구분은 NULL문자의 유무로 판단된다.
#include <stdio.h> int main(void) { char a[10]; fgets(a, sizeof(a), stdin); // 배열이름, 출력할 크기(배열보다 같거나 작게), 스트림 방식 printf("출력\n"); puts(a); } |
[ 예제 1 ]
길이가 6인 char형 배열에 fgets 함수를 써서 입력을 받는 소스코드에 배열의 길이보다 큰 문자열을 삽입한 소스코드이다.
배열의 크기보다 긴 문자열을 삽입하게 되면 배열의 크기 - NULL문자 만큼의 길이를 뺀 크기만큼 문자열을 받아들인다.
그리고 맨뒤에 NULL문자를 삽입한 뒤 다음 문자열을 받게된다.
#include <stdio.h> int main(void) { char a[6]; int i;
for (i = 0; i < 3; i++) { fgets(a, sizeof(a), stdin); printf("Read %d : %s\n", i + 1, a); } } |
[ 예제 2 ]
예제 1과는 달리 배열 크기보다 작은 문자열을 삽입 했더니 반복문마다 입력을 받게된다.
예제 2에서는 배열의 크기는 5지만 결과를 보았을 때 love 문자열을 입력 하니 바로 세번째 반복문으로 넘어간다.
이는 fgets 함수가 \n(엔터)를 만나기 전까지의 문자열을 받아들이기 때문이다. 하지만 배열의 크기는 5이고 love라는 4크기의 문자를 입력 했지만 3번째에는 문자를 입력하지 못했다. 이는 버퍼와 관련이 있는데 버퍼에 \n문자가 남아 있기 때문에 \n이 입력되어서 세번째 문자를 입력하지 못하고 끝난 것이다.
scanf_s 함수와 fgets 함수는 문자열을 입력 받는다는 공통점이 있지만 scanf_s 함수는 공백을 개행으로 인식하여 문자열에 공백을 삽입하지 못하고 fgets 함수는 \n만을 개행으로 인식하기 때문에 공백을 문자열에 삽입할 수 있다.
#include <stdio.h> int main(void) { char a[5]; int i;
for (i = 0; i < 3; i++) { fgets(a, sizeof(a), stdin); printf("Read %d : %s\n", i + 1, a); } } |
fgets 함수 공백
'C > 문법' 카테고리의 다른 글
[C언어] 문자열의 길이를 반환하는 strlen 함수 (0) | 2017.07.14 |
---|---|
[C언어] 표준 입출력 & 버퍼 (0) | 2017.07.14 |
[C언어] 문자 단위의 입출력 함수, EOF (0) | 2017.07.13 |
[C언어] 스트림의 의미 (0) | 2017.07.13 |
[C언어] srand를 이용한 난수 출력 (0) | 2017.07.12 |