프로그래밍 언어/C++

[C] 문자열(string) 입출력 (puts, fputs, gets, fgets) 사용법

ShovelingLife 2023. 9. 17. 17:37

문자열 출력 함수로 : puts, fputs 가 있다.

 

출력 함수 puts

 - 함수 원형: int puts(const char * string)

 - 반환형이 int인 이유? char형은 컴파일러마다 unsigned, signed가 다른데, int는 모든 컴파일러가 signed int로 처리함.

 - int형 이므로 어떤 컴파일러든 -1값(EOF)을 반환하는데 무리가 없다.

 - 자동으로 문자열 맨뒤 '\n' 개행이 붙는다.

 - char * 이므로 메모리상의 특정 문자열의 주소값이 그데로 전달 됨을 알 수 있다.

 

출력 함수 fputs

 - 함수 원형: int puts(const char * string, FILE * stdout)

 - 반환형이 int인 이유? char형은 컴파일러마다 unsigned, signed가 다른데, int는 모든 컴파일러가 signed int로 처리함.

 - int형 이므로 어떤 컴파일러든 -1값(EOF)을 반환하는데 무리가 없다.

 - 문자열 맨뒤 '\n' 개행이 붙지 않는다. (직접 붙어야 함)

 - puts와 마찬가지로 문자열의 주소값이 전달되나, 2번째 인자로 출력 형태를 정한다. stdout은 모니터 출력, 파일출력으로 변경 가능.

#include<stdio.h>

int main(void)
{
    char* str = "hello world";

    printf("1. puts test \n");
    puts(str);

    printf("2. fputs test \n");
    fputs(str, stdout);         // stdout : 모니터출력, 뒤에 개행이 없음

    return 0;
}

 

문자열 입력 함수로 : gets, fgets 가 있다.

 - 함수 원형: char gets(const char * string)

 - 함수 원형: char fgets(const char * string, int n ,FILE * stdin)

 

gets 사용 방법.

 - 할당 받은 배열 이상 초과하지 않도록 주의

 - 문자열의 끝인 NULL이 없는경우 메모리 침범문제 발생

int main(void)
{
	char str[7];	//	7개의 배열 공간 할당
	gets(str);	//	마지막 NULL을 포함한 6개의 문자열 가능. 그 이상 들어오면 할당되지 않은 메모리 침범 에러
}

 

fgets 사용 방법.

 - gets의 단점을 보완.

int main(void)
{
	char str[7];	//	7개의 배열 공간 할당
    // 배열의 주소, 배열의 크기, stdin-키보드입력
	fgets(str, sizeof(str), stdin);	
    
}

 

예제)

입력받은 문자열을 6자씩 잘라서 표현

#include<stdio.h>

int main(void)
{
    char str[7];
    int i;

    for (i = 0; i < 5; i++)
    {
        fgets(str, sizeof(str), stdin);
        printf("%d: %s\n", i+1, str);
    }

    return 0;
}

아래와 같이 입력하면 총 6개의 글이 들어간다. (맨뒤는 NULL문자가 있기에 배열길이가 7이다)

 

https://ansan-survivor.tistory.com/1321