C.3 string.h의 표준함수

lsw·2021년 4월 15일
0

C

목록 보기
4/9
post-thumbnail

1. 목적

String의 입/출력과 관련한 string.h 파일의 표준함수들을 사용해 보고 문제점을 파악해 보자.


2. 표준함수

  1. puts
  2. fputs
  3. gets
  4. fgets
  5. getchar

3. 코드

#include <stdio.h>
#include <string.h>
int main()
{
  char str1[10], str2[10];
  
  // 방법 1 (stdio.h -> printf)
  printf("이상원\nLee Sang Won\nLSW\n\n");

  //방법 2 (string.h -> fgets, fputs, puts for string arr "str")
  puts("Enter your name! : "); // 개행o
  fgets(str1, sizeof str1, stdin);
  fgets(str2, sizeof str2, stdin); // 에러 발생
  fputs(str1, stdout); // 개행x
  return 0;
}
  • Code explanation
    1. Set two string variables of char type and by using fgets
    2. input your own name into both variables
    3. print out

4. 결과(오류)

  • 다음의 문제가 발생한다.
  1. Enter your name! 후 "\n" 없이 자동 개행되는 모습이 보기 좋지 않다. 이는 puts의 자동개행 기능 때문.

  2. fgets → 이름입력 후 연속적인 fgets의 인자(str2) 입력이 불가능하다.(fgets 연달아 사용시 문제가 발생) 이는 stdin공간에 이전 값이 잔존해 있기 때문이다.


5. 문제해결

main function

void Erasestring(char str[]); // stdin에 저장된 이전값을 제거하는(불러들이는) 함수 선언

int main()
{
  char str1[10], str2[10];
  
  // 방법 1 (stdio.h -> printf)
  printf("이상원\nLee Sang Won\nLSW\n\n");

  //방법 2 (string.h -> fgets, fputs, puts for string arr "str")
  fputs("Enter str1 name! : ", stdout); // puts대신 fputs
  fgets(str1, sizeof str1, stdin);
  Erasestring(str1); // stdin에 잔존해 있는 쓰레기값 제거
  fputs("Enter str2 name! : ", stdout);
  fgets(str2, sizeof str2, stdin);
  fputs(str1,stdout);
  fputs(str2,stdout);
  return 0;
}
  • Code explanation

    주석에 상당부분 설명이 돼 있어 간략히 설명하자면

    1. puts는 자동개행이 이뤄진다.
    2. fputs는 자동개행이 이뤄지지 않는다.
    3. fgets에 인자입력 후 stdin에 임시저장(거쳐감)된 후 출력으로 불려나가기 전까지 값이 머물고 있으므로 별도의 함수로 불러내줘야 한다.

Erasestring function

void Erasestring(char str[])
{
  while(getchar() != '\n'); 
/* 문자열로 인식되기 위해선 '\n'가 말미에 붙어있어야하며 다루고 있는 string.h 파일의
표준함수들은 모두 문자열을 위한 것임으로.. fgets()로 받아들인 string 역시 말미에 '\n'가
붙어 임시공간에 머물게 된다. 따라서 '\n'전까지의 내용을 불러들여 공간을 비우면 동일한 공간
을 재사용할 수 있게 되는 것이다.
*/
}

6. 결과(수정)


7. 결론

아직 string 헤더파일 표준함수 사용의 필요성을 절감하지는 못하겠다. 하지만 미리 익혀둔다면 나쁠게 없다.

profile
미생 개발자

0개의 댓글