상세 컨텐츠

본문 제목

C 언어 예제, fgets 로 정수(숫자) 입력받기

컴퓨터 관련/C 언어 예제

by 열정과 함께 2015. 3. 31. 03:23

본문

연관된 글 보기 : fgets 의 동작


최근 들어 입력 함수를 점차 fgets 로 바꿔나가고 있다. 전에는 문자열을 입력받는 함수를 생각했는데, 시간이 가면서 좀 더 개선된 함수도 생각해 봤다.


1. 문자열 말고 정수도 입력받아 보자

2. 코드 짤때 뒤에 숫자만 바꿔 넣으면 자유자재로 받는 길이 조절되도록 만들자.


정수를 입력받으려니 문자열보다는 좀 까다로운 점이 있었는데, 문자열은 그대로 받아서 출력하고 표준입력버퍼(stdin) 만 관리하면 땡이지만 정수는 받으려니 자리수 감안을 해야한다는 점이 약간 귀찮은 점이었다. 그리고 malloc 을 적절하게 활용해 주어야 한다는 것 정도? 또 그리고 무작정 큰 수로 입력해버리면 int 자료형의 최대치를 벗어나니까 아예 사전에 차단하자 정도.....


작동 매커니즘은 대충 이런 식이다. 길이 검사 -> 길면 쳐냄. 받은 것 중에 숫자 아닌 것 있나 검사 -> 있으면 쳐냄 -> 길이도 맞고 숫자도 없으니까 정수 전환.


위의 사진은 일부러 입력할 때 최대 범위를 확 늘려잡아서 시작할 때부터 에러나게 만든 사진이고 아래는 정상범위 안에 있을 때 작동하는 모습이다. 






#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int input_num(int *result, int form);

int main()

{

int i;

printf("정수를 입력합니다. \n");

input_num(&i, 8);

printf("입력받은 수는? : %d \n", i);

printf("1 더하면? : %d \n", i+1);

return 0;

}

int input_num(int *result, int form)

{

int i;

int j=1;

int sign=1;

int input_size;

char *str;

if(form>9)

{

printf("입력 범위가 너무 큽니다. 함수 설정을 확인하십시오. \n");

return 0;

}

*result=0;

str=(char *)malloc(sizeof(char) * form+2);

for(;;)

{

sign=1;

fgets(str, form+2, stdin);

for(i=0;i<form+1;i++)

{

if(str[i]=='\n')

{

input_size=i;

break;

}

}

if(i==form+1)

{

printf("입력 범위를 초과했습니다. \n");

while(getchar() != '\n')

{}

printf("다시 입력하십시오 : ");

continue;

}

for(i=0;i<input_size;i++)

{

if(str[i]<48 || str[i]>57)

{

if(str[i] != '\n')

{

printf("숫자만 입력할 수 있습니다. \n");

printf("다시 입력하십시오 : ");

sign=0;

break;

}

}

}

if(sign==0)

{

continue;

}

for(i=0;i<input_size;i++)

{

*result=*result+(str[input_size-i-1]-48)*j;

j=j*10;

}

break;

}

free(str);

return 0;

}

관련글 더보기

댓글 영역