어째서 무한 루프가 걸리는 거죠 ㅠ,.ㅜ

NamSa의 이미지

어째서 무한 루프가 걸리는 거죠 ㅠ,.ㅜ
마땅히 찻아볼곳도 없고~~

Quote:
while(1){
printf("insert kor : ");
scanf("%d",&kor[i]);
}
맹고이의 이미지

while(1) 로 해놓고 어째서 무한루프인지 물으면 어떻게 대답해야될지... ;;
C 문법책을 보세요.

Prentice의 이미지

while (a==b) {} 루프에서 {} 루프 부분은 () 조건 부분이 참인 한 계속 실행됩니다.

C에서 거짓은 0, 참은 0이 아닌 값이므로 1은 참이겠죠. while (1) 때문에 계속 되는 것입니다.

NamSa의 이미지

scanf 에서.. 멈추길 바라는데 ..

원레는 scanf구문에서 멈추는 거아닌가요~~

Prentice의 이미지

조건문과 while loop, break를 책에서 다시 봐보세요..

#include <stdio.h>
main()
{
        int kor[100],eng[100],math[100],sum[100]; /* Bad! */
        int i=0,j,c;
        float av[100]; /* Bad! */
        char a;
        for(i=0;i<=100;i++){
                while(1){
                        printf("insert kor : ");
                        scanf("%d",&kor[i]);
                        if(100 <= kor[i] >= 0) /* Buggy! */
                                break;
                        kor[i]=-1;
                }

                printf("insert eng : ");
                scanf("%d",&eng[i]);
                printf("insert math : ");
                scanf("%d",&math[i]);
                sum[i] = kor[i]+eng[i]+math[i];
                av[i] = (float)sum[i]/3;
                printf("exit Ok?(y/n)");
                scanf("%s",&a);
                if(a=='y')
                        break;
        }

        printf("|%4s|%4s|%4s|%4s|%4s|\n","kor","eng","math","sum","av");
        for(j=0;j<=i;j++)
                printf("|%4d|%4d|%4d|%4d|%2.2f|\n",kor[j],eng[j],math[j],sum[j],av[j]);
}

이 코드에서는 어떻게 되어 있나요?

yui의 이미지

nan1004au wrote:
scanf 에서.. 멈추길 바라는데 ..

원레는 scanf구문에서 멈추는 거아닌가요~~

네. 멈춰야 정상입니다.
문제는 다른 데에 있어 보이네요.

liongo의 이미지

흐음 잘되는군요?

#include <stdio.h>

#define MAX_COUNT 10

int main() {

        int kor[ MAX_COUNT ];
        int i = 0;

        while(1){


                printf("insert kor  : ");
                scanf("%d",&kor[i]);

                printf("input value : %d\n", kor[i] );

                i++;

                if( i >= MAX_COUNT ) break;
        }
}

' 형식이 내용을 규정한다. '

세벌의 이미지

nan1004au wrote:
어째서 무한 루프가 걸리는 거죠 ㅠ,.ㅜ
마땅히 찻아볼곳도 없고~~
while(1){
	printf("insert kor : ");
	scanf("%d",&kor[i]);
}

마땅히 찾아 볼 곳이 없다니요? C언어의 기초인데요. C언어 책 쉬운 거 하나 골라서 공부해 보세요.

while(1){
	printf("insert kor : ");
	scanf("%d",&kor[i]);

	if(조건) break;
}

이런 식으로 어떤 조건일 때 빠져나갈지를 알려줘야죠. 안 그러면 무한루프 당연합니다.
ㅡ,.ㅡ;;의 이미지

sebul wrote:
nan1004au wrote:
어째서 무한 루프가 걸리는 거죠 ㅠ,.ㅜ
마땅히 찻아볼곳도 없고~~
while(1){
	printf("insert kor : ");
	scanf("%d",&kor[i]);
}

마땅히 찾아 볼 곳이 없다니요? C언어의 기초인데요. C언어 책 쉬운 거 하나 골라서 공부해 보세요.

while(1){
	printf("insert kor : ");
	scanf("%d",&kor[i]);

	if(조건) break;
}

이런 식으로 어떤 조건일 때 빠져나갈지를 알려줘야죠. 안 그러면 무한루프 당연합니다.

ㅎㅎ 저사람말은 무한루프가 그무한루프가 아닌듯..ㅎㅎ

하긴 질문한사람 질문이 좀.. 그렇네요. 오해하게 만드네요..


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

cdpark의 이미지

scanf에 숫자가 아닌 입력을 넣은 것 아닌가요?
scanf가 실패하고, kor[i]에는 정상적인 값이 안 들어간 상태로 계속 돌고요.

choissi의 이미지

음 scanf가 포맷 파싱에 실패하면
그 실패한 시점의 stdin버퍼의 내용을 버리는게 아니라
계속 가지고 있어서 무한 루프 돕니다.

윈도우라면
fflush(stdin);
을 scanf받기전에 해줘보세요.

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

NamSa의 이미지

현재 저의 목적은.. 문자열이 들어왓을 경우에 . .
에러 메시지를 뛰운후 .. 다시 .. 입력받도록 할려는 거에요~~
문자열이 들어가면.. 무한 루프가 되어버리네요`~

ixevexi의 이미지

혹시 enter값이 들어가서 그런것 아닐까요? ^^

저기 scanf("%d",...) 구문을
scanf("%d%*c",...)로 바꾸어도 그렇나요

저 scanf 문제는 저도 무척 궁금하네요
설익은 C 솜씨로 사실 저뒤의 %*c없이
enter값은 어디로 사라지는 지 모르겠습니다.

습관적으로 그냥 저도 %*c안쓰고 지금껏 잘 써왔는데
도대체 엔터값은 어디로 가는 것입니까?

-----------------------여기서부터 덧붙임------------------
그런데 혹시 -_- %d로 하고 문자열을 받는 것은 아니겠죠
문자열은 %s가 맞고요 설마 이 문제는 아니었겠죠?

C++, 그리고 C++....
죽어도 C++

lkjt의 이미지

음 그렇군요...

엔터값은 cin으로 받아도 잘 되는데 도대체 어디로 가는건지,,,

(혹시 엔터가 널로?)

jachin의 이미지

이런... 다음과 같이 입력 부분을 바꿔보시죠?

if(scanf("%s", kor)==1) break; else continue;

scanf 인수입력은 포인터이니 그냥 배열의 이름만 써도 포인터가 되겠죠? 만약 %s에 합당한 (즉, 단어 단위 입력이 맞다면) 반복이 중단되겠지만, 안되면 다시 시도하겠죠?

scanf 의 리턴값은 정확하게 받은 입력값의 갯수 입니다. 만약 %d로 대입자를 쓰신다면, 하나의 숫자(공백이나 널문자가 없는)를 입력 받고나면 끝납니다. if 문을 써서 정확한 인수를 받도록 하는 것도 좋은 방법이죠. -_-a

아. 그리고 공백 입력(\r\n 값이나 \0 값 등...)은 scanf 로는 못 받습니다. -_-a

fgets 같은 걸로 받으면 입력 받을 수는 있겠습니다. -_-a

lsj0713의 이미지

nan1004au wrote:
현재 저의 목적은.. 문자열이 들어왓을 경우에 . .
에러 메시지를 뛰운후 .. 다시 .. 입력받도록 할려는 거에요~~
문자열이 들어가면.. 무한 루프가 되어버리네요`~

scanf로는 도저히 불가능한 일입니다. fgets 함수 또는 scanf("%s", ...)를 이용해서 문자열로 입력을 받은 다음에 숫자인지 검사하여 atoi 함수를 이용해서 문자열을 숫자로 변환하여 저장해야 될 것 같습니다. 또는 간단하게 fgets 함수를 이용해서 문자열로 입력받은 다음에 sscanf 함수로 처리하는 방법도 있겠죠.

scanf 함수의 동작에 대해서는 다음 글이 도움이 되었으면 좋겠습니다.

http://groups.google.com/groups?selm=b794ei%24jg7%241%40news1.kornet.net

그리고 fflush(stdin)는 이식성이 없는 코드입니다. 애초에 fflush함수의 동작이 출력 스트림 이외의 스트림에 대해서는 정의되어 있지 않습니다. 또한 입력 스트림을 비우는 행위는 여러가지 문제가 많습니다. 표준 입출력에서 입력이 리다이렉션을 통해 들어왔다고 한다면, fflush(stdin) 을 하게 되면 아직 처리하지 않은 데이터들이 모조리 사라지는데 어떻게 해야 되겠습니까?

#  program < input_file.txt

단, Visual C++ 메뉴얼에는 fflush(stdin)이 나와있다고 하더군요. MS다운 짓이라고 해야 될까...

ps. 여기다가 바로 답글로 재질문 하셔도 되었을 텐데요.

http://bbs.kldp.org/viewtopic.php?t=37570

되도록이면 같은 주제는 같은 글타래에서 진행이 되도록 했으면 좋겠습니다.

댓글 달기

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