현재 저의 목적은.. 문자열이 들어왓을 경우에 . .
에러 메시지를 뛰운후 .. 다시 .. 입력받도록 할려는 거에요~~
문자열이 들어가면.. 무한 루프가 되어버리네요`~
scanf로는 도저히 불가능한 일입니다. fgets 함수 또는 scanf("%s", ...)를 이용해서 문자열로 입력을 받은 다음에 숫자인지 검사하여 atoi 함수를 이용해서 문자열을 숫자로 변환하여 저장해야 될 것 같습니다. 또는 간단하게 fgets 함수를 이용해서 문자열로 입력받은 다음에 sscanf 함수로 처리하는 방법도 있겠죠.
그리고 fflush(stdin)는 이식성이 없는 코드입니다. 애초에 fflush함수의 동작이 출력 스트림 이외의 스트림에 대해서는 정의되어 있지 않습니다. 또한 입력 스트림을 비우는 행위는 여러가지 문제가 많습니다. 표준 입출력에서 입력이 리다이렉션을 통해 들어왔다고 한다면, fflush(stdin) 을 하게 되면 아직 처리하지 않은 데이터들이 모조리 사라지는데 어떻게 해야 되겠습니까?
# program < input_file.txt
단, Visual C++ 메뉴얼에는 fflush(stdin)이 나와있다고 하더군요. MS다운 짓이라고 해야 될까...
while(1) 로 해놓고 어째서 무한루프인지 물으면 어떻게 대답해야될지
while(1) 로 해놓고 어째서 무한루프인지 물으면 어떻게 대답해야될지... ;;
C 문법책을 보세요.
while (a==b) {} 루프에서 {} 루프 부분은 () 조건 부분이
while (a==b) {} 루프에서 {} 루프 부분은 () 조건 부분이 참인 한 계속 실행됩니다.
C에서 거짓은 0, 참은 0이 아닌 값이므로 1은 참이겠죠. while (1) 때문에 계속 되는 것입니다.
scanf 에서.. 멈추길 바라는데 .. 원레는 scanf구문에서
scanf 에서.. 멈추길 바라는데 ..
원레는 scanf구문에서 멈추는 거아닌가요~~
메일 : nan1004au@gmail.com
조건문과 while loop, break를 책에서 다시 봐보세요..
조건문과 while loop, break를 책에서 다시 봐보세요..
이 코드에서는 어떻게 되어 있나요?
[quote="nan1004au"]scanf 에서.. 멈추길 바라는데 .
네. 멈춰야 정상입니다.
문제는 다른 데에 있어 보이네요.
흐음 잘되는군요?[code:1]#include <stdi
흐음 잘되는군요?
' 형식이 내용을 규정한다. '
Re: 어째서 무한 루프가 걸리는 거죠 ㅠ,.ㅜ
마땅히 찾아 볼 곳이 없다니요? C언어의 기초인데요. C언어 책 쉬운 거 하나 골라서 공부해 보세요.
이런 식으로 어떤 조건일 때 빠져나갈지를 알려줘야죠. 안 그러면 무한루프 당연합니다.
세벌 https://sebuls.blogspot.kr/
Re: 어째서 무한 루프가 걸리는 거죠 ㅠ,.ㅜ
ㅎㅎ 저사람말은 무한루프가 그무한루프가 아닌듯..ㅎㅎ
하긴 질문한사람 질문이 좀.. 그렇네요. 오해하게 만드네요..
----------------------------------------------------------------------------
scanf에 숫자가 아닌 입력을 넣은 것 아닌가요?scanf가 실패하
scanf에 숫자가 아닌 입력을 넣은 것 아닌가요?
scanf가 실패하고, kor[i]에는 정상적인 값이 안 들어간 상태로 계속 돌고요.
음 scanf가 포맷 파싱에 실패하면그 실패한 시점의 stdin버퍼의
음 scanf가 포맷 파싱에 실패하면
그 실패한 시점의 stdin버퍼의 내용을 버리는게 아니라
계속 가지고 있어서 무한 루프 돕니다.
윈도우라면
fflush(stdin);
을 scanf받기전에 해줘보세요.
울랄라~ 호기심 천국~!!
http://www.ezdoum.com
현재 저의 목적은.. 문자열이 들어왓을 경우에 . . 에러 메시지를
현재 저의 목적은.. 문자열이 들어왓을 경우에 . .
에러 메시지를 뛰운후 .. 다시 .. 입력받도록 할려는 거에요~~
문자열이 들어가면.. 무한 루프가 되어버리네요`~
메일 : nan1004au@gmail.com
혹시 enter값이 들어가서 그런것 아닐까요? ^^저기 scanf
혹시 enter값이 들어가서 그런것 아닐까요? ^^
저기 scanf("%d",...) 구문을
scanf("%d%*c",...)로 바꾸어도 그렇나요
저 scanf 문제는 저도 무척 궁금하네요
설익은 C 솜씨로 사실 저뒤의 %*c없이
enter값은 어디로 사라지는 지 모르겠습니다.
습관적으로 그냥 저도 %*c안쓰고 지금껏 잘 써왔는데
도대체 엔터값은 어디로 가는 것입니까?
-----------------------여기서부터 덧붙임------------------
그런데 혹시 -_- %d로 하고 문자열을 받는 것은 아니겠죠
문자열은 %s가 맞고요 설마 이 문제는 아니었겠죠?
C++, 그리고 C++....
죽어도 C++
음 그렇군요...엔터값은 cin으로 받아도 잘 되는데 도대체 어디
음 그렇군요...
엔터값은 cin으로 받아도 잘 되는데 도대체 어디로 가는건지,,,
(혹시 엔터가 널로?)
이런... 다음과 같이 입력 부분을 바꿔보시죠?[code:1]if
이런... 다음과 같이 입력 부분을 바꿔보시죠?
if(scanf("%s", kor)==1) break; else continue;
scanf 인수입력은 포인터이니 그냥 배열의 이름만 써도 포인터가 되겠죠? 만약 %s에 합당한 (즉, 단어 단위 입력이 맞다면) 반복이 중단되겠지만, 안되면 다시 시도하겠죠?
scanf 의 리턴값은 정확하게 받은 입력값의 갯수 입니다. 만약 %d로 대입자를 쓰신다면, 하나의 숫자(공백이나 널문자가 없는)를 입력 받고나면 끝납니다. if 문을 써서 정확한 인수를 받도록 하는 것도 좋은 방법이죠. -_-a
아. 그리고 공백 입력(\r\n 값이나 \0 값 등...)은 scanf 로는 못 받습니다. -_-a
fgets 같은 걸로 받으면 입력 받을 수는 있겠습니다. -_-a
[quote="nan1004au"]현재 저의 목적은.. 문자열이 들어왓을
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) 을 하게 되면 아직 처리하지 않은 데이터들이 모조리 사라지는데 어떻게 해야 되겠습니까?
단, Visual C++ 메뉴얼에는 fflush(stdin)이 나와있다고 하더군요. MS다운 짓이라고 해야 될까...
ps. 여기다가 바로 답글로 재질문 하셔도 되었을 텐데요.
http://bbs.kldp.org/viewtopic.php?t=37570
되도록이면 같은 주제는 같은 글타래에서 진행이 되도록 했으면 좋겠습니다.
댓글 달기