연관된 글 보기 : 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;
}
C 언어 예제, 대칭수 찾기. Project Euler 4번 (0) | 2016.05.20 |
---|---|
C 언어 예제, 도서 관리 프로그램 확장판(스압) (0) | 2015.04.11 |
C 언어 예제, fgets 를 통한 문자열 입력과 표준입력버퍼(stdin) 비우기 (0) | 2015.03.22 |
C 언어 예제, text(메모장) 파일에서 입력받기 (0) | 2015.01.18 |
C 언어 예제, 연결 리스트 연산, 데이터 자유자재로 추가 제거 (0) | 2015.01.08 |
댓글 영역