문자열 검사를 어떻게 하시는지 궁금합니다.

NamSa의 이미지

scanf 로 입력을 받을때..

숫자가 0~100 사이를 입력받는것 까지는 쉽게 되는데..

문자열 입력시 재입력 받도록 하는 방법이 궁금합니다.....

[ C언어]

june의 이미지

재입력이라..
입력값이 잘못되었을때 재입력을 받게하시겠다는 건가요?? :shock:

..
while(1)
{
   char string[100];
   scanf("%s",string);
   if(!string)
   break;
}
..

이건가요??

커피는 블랙이나 설탕만..

운형의 이미지

Quote:
while(1) 
{ 
   char string[100]; 
   scanf("%s",string); 
   if(!string) 
   break; 
} 
.. 

while() 문 딱 한번 실행되는거 아닌가요..?

Do you think that's the air you are breathing now?

랜덤여신의 이미지

운형 wrote:
Quote:
while(1) 
{ 
   char string[100]; 
   scanf("%s",string); 
   if(!string) 
   break; 
} 
.. 

while() 문 딱 한번 실행되는거 아닌가요..?

while(1) 
{ 
   char string[100]; 
   scanf("%s",string); 
   if(!string[0]) 
   break; 
} 
.. 

같군요.

이현연의 이미지

..
int a;
while(1)
{
if(scanf("%d",&a))
break;
else printf("다시입력하세요");
}
printf("입력된 숫자는 %d 입니다.",a);
..

이정도면 될듯하네요..

無知가 罪 !

ㅡ,.ㅡ;;의 이미지

이현연 wrote:
..
int a;
while(1)
{
if(scanf("%d",&a));
break;
else printf("다시입력하세요");
}
printf('입력된 숫자는 %d 입니다.",a);
..

이정도면 될듯하네요..


컴파일 안될꺼 같은데..ㅡ,.ㅡ;;;


----------------------------------------------------------------------------

ㅡ,.ㅡ;;의 이미지

barosl wrote:
운형 wrote:
Quote:
while(1) 
{ 
   char string[100]; 
   scanf("%s",string); 
   if(!string) 
   break; 
} 
.. 

while() 문 딱 한번 실행되는거 아닌가요..?

while(1) 
{ 
   char string[100]; 
   scanf("%s",string); 
   if(!string[0]) 
   break; 
} 
.. 

같군요.

딱한번 실행되는것도 아니고 첫번째는 무한반복이고

두번째것이 같은것도 아닙니다.


----------------------------------------------------------------------------

lunarainbow의 이미지

ㅡ,.ㅡ;; wrote:
이현연 wrote:
..
int a;
while(1)
{
if(scanf("%d",&a));
break;
else printf("다시입력하세요");
}
printf('입력된 숫자는 %d 입니다.",a);
..

이정도면 될듯하네요..


컴파일 안될꺼 같은데..ㅡ,.ㅡ;;;

될것 같은데..;;

scanf 리턴값이 몇개의 인자를 입력받았냐를 리턴하는 것이니깐.. 만약 숫자를 제대로 입력 받았다면 1을 리턴할테구, if 문이 사실로 판별할테구, break 통해 while 빠져나가는거 아닌가요?

애시당초 목표였던 0~100사이의 수를 검사하는건 아니지만.. 컴파일에는 문제 없을것 같은데.. ^^;;

lsj0713의 이미지

이런 방식은 어떻습니까?

#include <stdio.h>

int main(void)
{
    int i;
    char buf[100];

    while (1)
    {
        printf("Input number : ");
        scanf("%s", buf);
        if ( sscanf(buf, "%d", &i) == 1 ) { break; }
        printf("Error!\n");
    }

    printf("Num = %d\n", i);

    return 0;
}

그리고 위의 이현인 님의 코드는 scanf가 입력 스트림 내의 잘못된 입력값을 소모하지 않는다는 단점이 있습니다. 문자열이 입력될 경우 무한루프 돌게 되죠.

이현연 wrote:
..
int a;
while(1)
{
if(scanf("%d",&a))
break;
else printf("다시입력하세요");
}
printf("입력된 숫자는 %d 입니다.",a);
..

이정도면 될듯하네요..

이현연의 이미지

lsj0713 wrote:
이런 방식은 어떻습니까?

#include <stdio.h>

int main(void)
{
    int i;
    char buf[100];

    while (1)
    {
        printf("Input number : ");
        scanf("%s", buf);
        if ( sscanf(buf, "%d", &i) == 1 ) { break; }
        printf("Error!\n");
    }

    printf("Num = %d\n", i);

    return 0;
}

그리고 위의 이현인 님의 코드는 scanf가 입력 스트림 내의 잘못된 입력값을 소모하지 않는다는 단점이 있습니다. 문자열이 입력될 경우 무한루프 돌게 되죠.

그래서 제가 아래처럼 키보드 버퍼를 지우는 함수를

추가하고 싶었는데요.. C언어를 오래전에 해봐서요..

그 함수 이름을 모르겠더라구요..

sscanf를 추가로 다시 쓰는거 보다 키보드 버퍼를

매 루프 반속때마다 키보드 버퍼를 지우는게

더 효율적이지 않을까요?

while(1)
{
// 여기에 키보드 버퍼 지우는 함수 호출
if(scanf("%d",&a))
break;
else printf("다시입력하세요");
}

無知가 罪 !

ㅡ,.ㅡ;;의 이미지

lunarainbow wrote:
ㅡ,.ㅡ;; wrote:
이현연 wrote:
..
int a;
while(1)
{
if(scanf("%d",&a));
break;
else printf("다시입력하세요");
}
printf('입력된 숫자는 %d 입니다.",a);
..

이정도면 될듯하네요..


컴파일 안될꺼 같은데..ㅡ,.ㅡ;;;

될것 같은데..;;

scanf 리턴값이 몇개의 인자를 입력받았냐를 리턴하는 것이니깐.. 만약 숫자를 제대로 입력 받았다면 1을 리턴할테구, if 문이 사실로 판별할테구, break 통해 while 빠져나가는거 아닌가요?

애시당초 목표였던 0~100사이의 수를 검사하는건 아니지만.. 컴파일에는 문제 없을것 같은데.. ^^;;

님 컴파일 해보시고 말씀하시는거에요??ㅡ,.ㅡ;;

컴파일 해보세요 되나..^^;;


----------------------------------------------------------------------------

choissi의 이미지

/*****************************************************************************
 * 설명      : 출납액을 입력 받는다.
 * Prototype : int input_amt(char *msg) 
 * Arguments : char *msg : 메시지
 * Return    : 성공 : 입력받은 금액, 실패 : -1
 ****************************************************************************/
int input_amt(char *msg ) {

	int tmp_amt=0;
	int input_cnt =0;

	if (msg == NULL) return -1;

	do {
		
		/* stdin 쓰레기값 클리어 */
		fflush (stdin);   
		printf("%s : ", msg); 
		input_cnt = scanf("%d",&tmp_amt);

		if(input_cnt != 1 || tmp_amt <= 0){
			printf("출납액이 바르지 않습니다.\n");
			continue;
		}
		return tmp_amt;

	}while(1);    

}

scanf의 리턴 값은 포맷 파싱에 성공한 갯수를 리턴합니다.
그것으로 문자인지 숫자가 들어 왔는지 확인이 가능하죠.

또 fflush (stdin); 에 주의 하셔야 하는데
windows CRT library는 scanf가 파싱에 실패한
stdin에 대해서는 버퍼에서 꺼내지 않더군요
그러니 fflush를 안해주면 while에서 무한 루프에
빠지게 됩니다.

울랄라~ 호기심 천국~!!
http://www.ezdoum.com

lunarainbow의 이미지

ㅡ,.ㅡ;; wrote:
lunarainbow wrote:
ㅡ,.ㅡ;; wrote:
이현연 wrote:
..
int a;
while(1)
{
if(scanf("%d",&a));
break;
else printf("다시입력하세요");
}
printf('입력된 숫자는 %d 입니다.",a);
..

이정도면 될듯하네요..


컴파일 안될꺼 같은데..ㅡ,.ㅡ;;;

될것 같은데..;;

scanf 리턴값이 몇개의 인자를 입력받았냐를 리턴하는 것이니깐.. 만약 숫자를 제대로 입력 받았다면 1을 리턴할테구, if 문이 사실로 판별할테구, break 통해 while 빠져나가는거 아닌가요?

애시당초 목표였던 0~100사이의 수를 검사하는건 아니지만.. 컴파일에는 문제 없을것 같은데.. ^^;;

님 컴파일 해보시고 말씀하시는거에요??ㅡ,.ㅡ;;

컴파일 해보세요 되나..^^;;

이런.. 대충 보다 실수를 했네요.

   if(scanf("%d",&a));
      break;
   else printf("다시입력하세요");

if 문 뒤에 ';' 가 살포시 찍혀 있었군요. 그 담에 break가 오는 바람에 else는 어디로 가야 할지 모를테고..

자세히 보지않고 올렸네요. :oops:

그런데 아마 저 세미콜론은 실수로 찍으신것이 아닐까요? ^^;;

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.