2013-10-14 3 views
5

나는 KR 's The C 프로그래밍 언어를 읽고있어 putchar와 getchar에 혼란스러워하고있다. 나는 10 개의 문자를 입력하는 프로그램을 만들었고 그 프로그램은 다시 화면에 출력했다.Putchar와 Getchar in C

#include <stdio.h> 

int main() 
{ 
    int i; 
    int ch; 
    for(i = 0; i < 10; i++) 
    { 
     printf("Enter a single character >> "); 
     ch = getchar(); 
     putchar(ch); 
    } 

    return 0; 
} 

나는이 같은 출력을 얻을 것으로 예상 :

Enter a single character >> a 
a 
Enter a single character >> b 
b 

을 ... 그래서 10 배에 그러나 이것은 내가 가진 출력 :

(I 2 개 문자를 입력 한 후 정지)
Enter a single character >> a 
aEnter a single character >> 
Enter a single character >> b 
bEnter a single character >> 
Enter a single character >> 

내 입력 문자가 고정 문자열과 결합되어 출력되는 이유를 확실하지 않습니다.

또한 int를 사용하여 문자를 저장하는 이유가 확실하지 않습니다.

답변

4
putchar(ch); 

는 단지 하나의 문자와 다음 printf 같은 줄에서 계속 인쇄합니다. 간단하게 추가하십시오 printf이 실행되기 전에 명시 적으로 새로운 라인을 시작하는

putchar('\n'); 

오른쪽 putchar(ch); 후.

for(i = 0; i < 10; i++) 
{ 
    printf("Enter a single character >> "); 
    ch = getchar(); 
    getchar();  // <-- "eat" new-line character 
    putchar(ch); 
    putchar('\n'); // <-- start new line 
} 
+1

답장을 보내 주셔서 감사합니다. 그러나 코드는 여전히 작동하지 않습니다. "한 문자 만 입력하십시오"는 두 번 인쇄하면 안됩니다. 내 메인 게시물과 마지막 코드 블록을 보면 두 번째 줄에 무슨 뜻인지 알 수 있습니다. char a는 "Enter single character >>"문자열에 이어 "Enter single character">> "문자열이 즉시 화면에 다시 인쇄됩니다. –

+0

@CS 학생 : 알겠습니다. 내 대답을 지금 확인하십시오 :) – LihO

4

새 줄을 인쇄하지 않습니다. putchar(ch); 이후에 새 줄을 인쇄하려면 putchar('\n');을 사용해야합니다.

+1

감사하지만 그래도 코드가 작동 "단일 문자를 >> 입력"하지 않습니다 여전히 두 번 인쇄 할 때이 shouldn 그러지 마라. 내 메인 게시물과 마지막 코드 블록을 보면 두 번째 줄에 무슨 뜻인지 알 수 있습니다. char a는 "Enter single character >>"문자열에 이어 "Enter single character">> "문자열이 즉시 화면에 다시 인쇄됩니다. –

2

사용자 단말 표준 및 비 - 표준 모드에서 작동 할 수 있습니다 또한 당신은 또한 당신이 문자를 입력 한 후이 유지 입력에서 '\n'을해야합니다. 기본적으로 표준 모드로 작동하므로 표준 입력을 프로그램별로 줄 단위로 사용할 수 있습니다 (기호 단위가 아님). 문제의 사용자 입력 무언가 (문자 'a', 16 진수 0x61하자) 및 입력 (새 줄 문자 '0x0A'16 진수) 밀어. 아스키 표는 here입니다. 그래서이 액션은 프로그램에 두 개의 심볼을줍니다. man getchar()에서 언급했듯이 그것은 symbol-by-symbol을 읽습니다. 따라서 루프는 한 문자에 대해 두 번 반복됩니다. 사용에 다음 프로그램을 무슨 일이 일어나고 있는지 확인하려면 (+ 루프 카운터 출력, + 문자 코드 출력) :

#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
    int i; 
    char ch; 
    for(i = 0; i < 10; i++) 
    { 
    printf("Enter a single character %d >>", i); 
    ch = getchar(); 
    printf("Ch=0x%08X\n", ch); 
    /*putchar(ch);*/ 
    } 

    return 0; 
} 

출력 :

┌─(02:01:16)─([email protected])─(~/tmp/getchar) 
└─► gcc -o main main.c; ./main 
Enter a single character 0 >>a 
Ch=0x00000061 
Enter a single character 1 >>Ch=0x0000000A 
Enter a single character 2 >>b 
Ch=0x00000062 
Enter a single character 3 >>Ch=0x0000000A 
Enter a single character 4 >>^C 

그래서 프로그램이 두 심볼을 얻고을 인쇄합니다. 그리고 새 줄 기호가 보이지 않습니다. 그래서 질문 사용자가 하나 이상한 추가 라인을 참조하십시오. 다른 터미널 모드 및 조정 방법에 대한 자세한 설명은 here입니다.

또한 stty 유틸리티는 터미널 옵션을 사용하는 동안 유용 할 수 있습니다 ("icanon"은 터미널이 표준 모드를 ​​사용하는지 여부를 알려줍니다).

getchar() 출력에 char을 int로 저장하는 것과 비슷한 주제에 대해서는 answer을 참조하십시오.

0

루프가 짝수이면 키보드에서 입력을 가져 오지 않지만 이전 입력 한 히트에서 가져온 것이므로 루프가 5 회만 실행됩니다. 따라서 새로운 문자를 ch에 입력 할 수 있도록 버퍼를 지워야합니다. 즉, 누른 상태로 입력해야합니다.

for (i = 0; i < 5; i++) 
    { 
     printf("\nEnter a single character >> "); // new line 
     ch = getchar(); 
     while (getchar() != '\n'); //Clearung buffer. 
     putchar(ch); 
    } 
0

하지 이상적인 확실하지만,이 일 : 응답에 대한

#include <stdio.h> 
    int main() 
    { 
     int i; 
     int ch; 
     for(i = 0; i < 10; i++) 
     { 
      printf("Enter a single character >> "); 
      getchar(); 
      ch=getchar(); 
      putchar(ch); 
     } 

     return 0; 
     } 
+0

잘못되었습니다. 첫 번째'getchar()'는 사용자 입력을 먹을 것이고'ch'는 줄 바꿈 문자를 얻을 것이다. – Cyril

+1

나는 고마워. :) –