반복문안에 getchar가 이상합니다. 왜 그런지 가르쳐 주세요~~

ins878의 이미지

프로그램을 짜다가 도저히 이해가 안됩니다. 물론 다른 자료를 찾아봤는데도, 이것에 관한 내용은 없는 것 같아서 글을 올립니다. (이것에 삽질 5시간~~바보인가 봐요~~ T.T )

#include <stdio.h>

int main()
{
	char c;

	printf("Test\n");

	do
	{
		printf("get : ");
		c = getchar();
	}while(c != 'y');

	return 0;
}

위 소스코드를 실행하면 아래와 같이 나옵니다

test
get : a(입력)
get : get : b(입력)
get : get :

이상한 것이 Enter를 치면 get :이라는 문자출력이 1번만 되는데, 다른 문자(예, a, b)를 입력하면 get: get: 이라고 화면에 출력이 됩니다.
gdb로 확인해 보니깐 y가 아닌 다른 문자를 입력을 하면 while문 2번 실행(getchar 1번 무시)이 됩니다.

왜 이런 결과가 나오는지~??? 혹시 stream 때문인가요?
아~ 자료를 찾아봐도 왜 이런 결과가 나오는지 해답을 모르겠습니다.

왜 이런 결과가 나오는지 고수님들 가르쳐 주세요~ 이 문제를 해결하기 위한 다른 방안이라도~ 부탁드립니다.

익명 사용자의 이미지

ins878 wrote:
프로그램을 짜다가 도저히 이해가 안됩니다. 물론 다른 자료를 찾아봤는데도, 이것에 관한 내용은 없는 것 같아서 글을 올립니다. (이것에 삽질 5시간~~바보인가 봐요~~ T.T )

#include <stdio.h>

int main()
{
	char c;

	printf("Test\n");

	do
	{
		printf("get : ");
		c = getchar();
	}while(c != 'y');

	return 0;
}

위 소스코드를 실행하면 아래와 같이 나옵니다

test
get : a(입력)
get : get : b(입력)
get : get :

이상한 것이 Enter를 치면 get :이라는 문자출력이 1번만 되는데, 다른 문자(예, a, b)를 입력하면 get: get: 이라고 화면에 출력이 됩니다.
gdb로 확인해 보니깐 y가 아닌 다른 문자를 입력을 하면 while문 2번 실행(getchar 1번 무시)이 됩니다.

왜 이런 결과가 나오는지~??? 혹시 stream 때문인가요?
아~ 자료를 찾아봐도 왜 이런 결과가 나오는지 해답을 모르겠습니다.

왜 이런 결과가 나오는지 고수님들 가르쳐 주세요~ 이 문제를 해결하기 위한 다른 방안이라도~ 부탁드립니다.

a <- Enter를 입력하면 a와 newline 두 문자가 입력되는 것이 아닌가요? 당연히 모두 y가 아니가 때문에 두번루프를 돌것이고....
y를 입력하면 뒤의 newline문자를 체크하기전에 루프가 끝날것이고...
제가 C를 안한지 오래되었기 때문에.....
한번 체크해보세요.

익명 사용자의 이미지

Anonymous wrote:
ins878 wrote:
프로그램을 짜다가 도저히 이해가 안됩니다. 물론 다른 자료를 찾아봤는데도, 이것에 관한 내용은 없는 것 같아서 글을 올립니다. (이것에 삽질 5시간~~바보인가 봐요~~ T.T )

#include <stdio.h>

int main()
{
	char c;

	printf("Test\n");

	do
	{
		printf("get : ");
		c = getchar();
	}while(c != 'y');

	return 0;
}

위 소스코드를 실행하면 아래와 같이 나옵니다

test
get : a(입력)
get : get : b(입력)
get : get :

이상한 것이 Enter를 치면 get :이라는 문자출력이 1번만 되는데, 다른 문자(예, a, b)를 입력하면 get: get: 이라고 화면에 출력이 됩니다.
gdb로 확인해 보니깐 y가 아닌 다른 문자를 입력을 하면 while문 2번 실행(getchar 1번 무시)이 됩니다.

왜 이런 결과가 나오는지~??? 혹시 stream 때문인가요?
아~ 자료를 찾아봐도 왜 이런 결과가 나오는지 해답을 모르겠습니다.

왜 이런 결과가 나오는지 고수님들 가르쳐 주세요~ 이 문제를 해결하기 위한 다른 방안이라도~ 부탁드립니다.

a <- Enter를 입력하면 a와 newline 두 문자가 입력되는 것이 아닌가요? 당연히 모두 y가 아니가 때문에 두번루프를 돌것이고....
y를 입력하면 뒤의 newline문자를 체크하기전에 루프가 끝날것이고... 입력받은 y를 출력해보세요.
제가 C를 안한지 오래되었기 때문에.....
한번 체크해보세요.

cinsk의 이미지

여기에서 getchar로 검색해보기 바랍니다.

jachin의 이미지

루프가 끝나기 전에 getchar 문을 한 번 더 써주세요. 물론 변수 대입 안하셔도 되고요. 그냥 getchar(); 한 줄만 추가해 주시면 되요. 만약 빈칸 입력을 (값이 입력 안되고 엔터만 입력될 경우라던가, 빈칸 입력이 되는 경우) 받을 수 있도록 소스코드를 작성하시겠다면 do~while 문 보다는 while 문을 사용하셔서 조건식에 getchar 문을 삽입하세요. 그 다음 안에서 if 문을 이용하셔서 break 를 넣으셔도 됩니다.

eungkyu의 이미지

c = getchar(); 대신에 scanf (" %c", &c); 로 해보세요. (%c 앞에 빈칸이 포인트)

댓글 달기

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