C언어에서 표준 입력 함수를 이용해서 인터랙티브한 입력 기능을 구현하는 건 상당히 어렵습니다.
원래 표준 입력은 범용 입력 스트림에 대해 동작하도록 설계된 거라서 실시간으로 피드백을 주는 기능이 없어요.
그럼에도 불구하고, 사용자가 키보드 앞에 앉아서 엔터를 눌러 줄 단위로 입력을 넣어줄 거라는 가정이 있다면
어떻게든 해 보는 게 불가능하지만은 않습니다.
물론 그 경우에도 구체적으로 에러 처리를 어떻게 하느냐에 따라 수많은 구현이 있을 수 있고, 또 각자 나름대로 결점이 있을 겁니다.
최소한의 요구조건을 아래 세 가지로 정합시다.
1. 사용자가 어떤 시점에서든 정상적인 입력을 넣어서 입력을 마칠 수 있어야 하겠습니다.
즉 통제 불가능한 무한루프에 빠진다거나 하는 등의 비가역적인 상태에 빠져선 안 됩니다.
2. 조건을 만족하지 못한 채 파일이 끝났거나(EOF) 기타 에러가 발생한 상황을 잡아낼 수 있어야겠죠.
3. 입력을 정상적으로 마쳤다면 반드시 사용자가 입력했던 숫자를 가지고 있어야 합니다.
라인 단위로 문자열 입력을 받아서 사후에 파싱하거나, 아예 getc 기반으로 스캐너를 짤 수도 있겠지만, 이 문제의 경우에는 scanf만을 이용해서 어떻게 해 볼 수도 있을 것 같군요. 수행 성능은 어찌될지 모르겠지만요.
간단한 시범 구현 하나를 만들어 봤습니다.
#include <stdio.h>int get_integer(int*num){while(scanf("%d", num)!=1){// 정수를 입력받을 수 없다면...if(feof(stdin)){// 입력을 재개할 수 있는지를 먼저 테스트하고,return-1;// End of File}elseif(ferror(stdin)){return-2;// File stream error}printf("숫자를 입력하세요:");// 재개할 수 있다면 안내 문구를 출력한 뒤scanf("%*[^\n]");// 개행 문자가 발견될 때까지 입력을 모조리 뽑아서 버립니다.// 그러고 나서 재시작. 물론 이 정책은 제가 임의로 만든 겁니다.// 마음에 안 드시면 직접 고치시면 됩니다.}return0;// Success}int main(void){int num;if(get_integer(&num)==0)printf("입력된 숫자 : %d\n", num);elseputs("입력 실패");return0;}
...
사실 사용자 입력, 더 나아가서 사용자 인터페이스를 어떻게 하면 견고하면서도 사용하기 좋게 만들 수 있느냐는 진짜 연구 대상입니다.
사람은 일관성 없이 행동하는 변덕쟁이인 데다 부주의하고, 그런 주제에 매뉴얼도 잘 안 읽죠. 때문에 프로그램이 어지간히 복잡해지지 않는 한, 사용자 응대가 프로그램 전체에서 가장 까다로운 부분이 되는 경우가 많아요. 어쩔 수 없는 일이지요.
while(1){
printf("탐색 할 목록중 수정하실 num 값을 입력 해주세요 :"); scanf("%d",&num);
rewind(stdin);
while(1){
if (num == num2[i] )
break;
i++;
if(i >= i2 ){
printf("잘못 입력하셨습니다. 다시 입력 해주세요.\n");
i=0;
break;
}
}
if (num == num2[i] )
break;
}
여기서 num2[] 배열에다 목록사항에있는 번호들을 저장하고
그수와 같은경우 넘어가게끔 근데 문제가 저배열안에다 최대한 큰수를 넣긴했는데
만약 장난친다면 에러가 날거같네요 하하;;;
https://kldp.org/node/149137
https://kldp.org/node/149137
세벌 https://sebuls.blogspot.kr/
0~9 뿐만아니라 다른정수도 받아야하는데
저건 0~9만 받지않나요?
C언어에서 표준 입력 함수를 이용해서 인터랙티브한
C언어에서 표준 입력 함수를 이용해서 인터랙티브한 입력 기능을 구현하는 건 상당히 어렵습니다.
원래 표준 입력은 범용 입력 스트림에 대해 동작하도록 설계된 거라서 실시간으로 피드백을 주는 기능이 없어요.
그럼에도 불구하고, 사용자가 키보드 앞에 앉아서 엔터를 눌러 줄 단위로 입력을 넣어줄 거라는 가정이 있다면
어떻게든 해 보는 게 불가능하지만은 않습니다.
물론 그 경우에도 구체적으로 에러 처리를 어떻게 하느냐에 따라 수많은 구현이 있을 수 있고, 또 각자 나름대로 결점이 있을 겁니다.
최소한의 요구조건을 아래 세 가지로 정합시다.
1. 사용자가 어떤 시점에서든 정상적인 입력을 넣어서 입력을 마칠 수 있어야 하겠습니다.
즉 통제 불가능한 무한루프에 빠진다거나 하는 등의 비가역적인 상태에 빠져선 안 됩니다.
2. 조건을 만족하지 못한 채 파일이 끝났거나(EOF) 기타 에러가 발생한 상황을 잡아낼 수 있어야겠죠.
3. 입력을 정상적으로 마쳤다면 반드시 사용자가 입력했던 숫자를 가지고 있어야 합니다.
라인 단위로 문자열 입력을 받아서 사후에 파싱하거나, 아예 getc 기반으로 스캐너를 짤 수도 있겠지만, 이 문제의 경우에는 scanf만을 이용해서 어떻게 해 볼 수도 있을 것 같군요. 수행 성능은 어찌될지 모르겠지만요.
간단한 시범 구현 하나를 만들어 봤습니다.
...
사실 사용자 입력, 더 나아가서 사용자 인터페이스를 어떻게 하면 견고하면서도 사용하기 좋게 만들 수 있느냐는 진짜 연구 대상입니다.
사람은 일관성 없이 행동하는 변덕쟁이인 데다 부주의하고, 그런 주제에 매뉴얼도 잘 안 읽죠. 때문에 프로그램이 어지간히 복잡해지지 않는 한, 사용자 응대가 프로그램 전체에서 가장 까다로운 부분이 되는 경우가 많아요. 어쩔 수 없는 일이지요.
일단 저는 이렇게 해결 했습니다.
댓글 달기