C언어 문자열 입출력을 위한 함수 (gets,puts,fgets,fputs)

c언어에서 사용할 수 있는 문자열 입출력 함수 gets, puts, fgets, fputs들을 하나하나 알아보겠습니다

 

 

gets, puts 함수

gets함수는 문자열을 입력받을 때 사용하는 함수입니다

puts함수는 문자를 그대로 출력하거나 문자 배열을 출력하고 printf와 다르게 줄 바꿈을 하여 커서의 위치가 아래로 바뀌게 됩니다

 

근데 문자열을 입력받는 함수 하면 scanf가 떠오르지 않나요?? 이 gets함수는 scanf와는 조금 성질이 다릅니다

 

scanf,printf

scanf함수 의경우 문자열을 입력받을 때 공백을 기준 삼아 입력받습니다

지정된 a문자 배열 리스트에는 공백을 기준으로 각각의 배열에 저장되게 됩니다

그래서 1 2 3 4라는 값이 입력되면 공백을 기준으로 a[0] = 1, a[1] = 2, a[2] = 3, a[3] = 4를 입력받게 됩니다

그리고 printf로 출력하면 첫 번째 배열 요소에 담겨있는 1이라는 값만 출력되는걸 확인할 수 있습니다

 

gets,puts

gets함수의 경우 공백을 포함하여 enter키가 입력될 때까지의 문자열을 읽을 수 있습니다

그래서 1,2,3,4를 입력할 경우 puts함수로 문자 배열의 문자열 1 2 3 4를 출력해주는 걸 확인할 수 있습니다

 

gets함수의 문제

gets함수의 문제점은 char a[10] 지정된 배열의 길이보다 더 많은 값을 입력할 경우 할당되지 않은 메모리 영역에 침범하여 Segmentation fault (core dumped)가 발생됩니다 

보안상의 문제도 있고 바이러스가 실제로 이런 문제점을 이용하는 경우가 있기 때문에 대체로 쓸 수 있는 fgets함수가 등장하게 되었습니다

 

 

gets의 대체 함수 fgets

fgets 함수는 (배열의 주소, 배열의 크기, stdin(키보드 입력))형태로 매개변수를 넘겨받으면서 gets함수와 비슷하게 공백을 포함하여 enter가 입력될 때까지 값은 받으나 지정된 배열의 크기만큼만 값을 입력받게 됩니다

 

그래서 지정된 크기[10]보다 더 많은 값 12345678910을 입력하더라도 9 다음에 문자열에서 반드시 필요한 Null문자까지 포함하여 총 10개 출력상에는 1 ~ 9까지만 출력되는걸 확인할 수 있습니다

 

 

 

Top