숫자만 입력받게끔...

익명 사용자의 이미지


제가 함수를 짜는데 다른 라이브러리 is?? 그거 말고

제가
scanf("%d",&num);

이런식으로 입력을 받는데
예외 처리로 num 값이 정수가아닌 문자 또는 문자열을 입력받을 경우 다시 입력을 하라는것을 출력해야
합니다

숫자가 제한될경우 if문을 쓰면되지만 모든 정수 숫자를 받을 수있는 프로그램이어야해서 문제가생겨
질문 드립니다 어떻게 해야될까요...?

세벌의 이미지

익명 사용자의 이미지

저건 0~9만 받지않나요?

 의 이미지

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
		}
		else if (ferror(stdin)) {
			return -2; // File stream error
		}
		printf("숫자를 입력하세요:"); // 재개할 수 있다면 안내 문구를 출력한 뒤
		scanf("%*[^\n]"); // 개행 문자가 발견될 때까지 입력을 모조리 뽑아서 버립니다.
		// 그러고 나서 재시작. 물론 이 정책은 제가 임의로 만든 겁니다.
		// 마음에 안 드시면 직접 고치시면 됩니다.
	}
	return 0; // Success
}
 
int main(void) {
	int num;
	if (get_integer(&num) == 0)
		printf("입력된 숫자 : %d\n", num);
	else
		puts("입력 실패");
	return 0;
}

...

사실 사용자 입력, 더 나아가서 사용자 인터페이스를 어떻게 하면 견고하면서도 사용하기 좋게 만들 수 있느냐는 진짜 연구 대상입니다.

사람은 일관성 없이 행동하는 변덕쟁이인 데다 부주의하고, 그런 주제에 매뉴얼도 잘 안 읽죠. 때문에 프로그램이 어지간히 복잡해지지 않는 한, 사용자 응대가 프로그램 전체에서 가장 까다로운 부분이 되는 경우가 많아요. 어쩔 수 없는 일이지요.

익명 사용자의 이미지

	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[] 배열에다  목록사항에있는 번호들을 저장하고  
그수와 같은경우 넘어가게끔 근데 문제가 저배열안에다 최대한 큰수를 넣긴했는데
만약 장난친다면 에러가 날거같네요 하하;;;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.