2013-03-20 2 views
0

필자는 특정 키를 누르는 것과 일치하는 숫자 ASCII 값을 표시하고자하는 작은 C 프로그램을 작성했습니다.동일한 C 프로그램에서 putchar 및 printf를 함께 사용 하시겠습니까?

내 코드는 다음과 같습니다. 문제는 프로그램을 실행 한 후 입력을 받아들이지 만 다른 것은하지 않는다는 것입니다. 첫 번째 printf 문까지 도달하지도 않습니다. 문제가 무엇인지 파악할 수 없습니다. 은 동일한 프로그램의 getf() 함수와 printf() 함수를 혼합 할 때 문제가 있습니까? Cygwin에서와

#include <stdio.h> 

int main() { 

    const int numKeys = 256; 

    int keys[numKeys]; 

    int i; 
    for (i = 0; i < numKeys; i++) { 

     keys[i] = 0; 
    } 

    printf("\n Start pressing some keys!\n\n"); 

    int c; 
    while ((c = getchar()) != EOF) { 

     printf(" CAPTURED: %d\n", c); 

     keys[c]++; 
    } 

    printf("\n\n ** RESULTS ** \n\n"); 

    for (i = 0; i < numKeys; i++) { 

     if (keys[i] != 0) { 

      printf(" Key with value %d was called %d times.", i, keys[i]); 
     } 
    } 
} 

나는 윈도우 XP 프로 기계를 가지고 있음을 명확히해야한다가 설치되어 있어야합니다. Cygwin을 개발 공간으로 사용하기 때문에이 환경에서이 유형의 프로그램을 실행할 때 다른 점이 있는지 궁금합니다.

+0

나는 getch 효과가 stdin으로 나타나고, printf 효과가 stdout 인 것처럼 혼합하는 데 문제가 있다고 생각하지 않습니다. 나는 그 문제가 다른 곳에있을 것이라고 생각한다. – jacob

+0

Enter 키를 누르십니까? – Xymostech

+0

'printf ("result")'또는'printf (captured)'에 도달하지 못했습니까? 그렇다면'EOF'를 얻지 못하면 어떻게'while loop'를 깨뜨릴 것인가? 'getchar'는'\ r \ n' 또는'Enter'가 눌러지기를 기다립니다. getche를 사용하십시오. 하지만 그때조차도 첫 번째 문제가 발생할 것입니다. –

답변

0

문제점을 발견했습니다. 난 당신이 사람이 입력 안타 후이/반환 결과를 인쇄해야 할 경우 대신

while ((c = getchar()) != EOF && c != '\n')

을 사용하려는 생각합니다.

0

문제 1 : Enter 키 용액을 누르지 않아도 printf(" CAPTURED: %d\n", c);에 도착은 : 동안 getche() 루프를 사용하는 것이다.

문제 2 : 'printf ("\ n \ n ** RESULTS ** \ n \ n");' 또는 본질적으로 루프를 깨는?

해결책 : 수 없습니다. 키보드에서 읽는 한 결코 EOF을 얻지 못할 것입니다. 해결 방법 : stdin을 닫거나 EOF이 아닌 이스케이프 문자를 사용하십시오.

편집 : 해결 방법 2 : -> getchar() 자체를 사용하십시오. 하지만 입력 된 문자를 인쇄하려면 Enter 키를 눌러야합니다. 이제 창문에 ctrl+zEOF이지만, Enter 키를 누른 후 줄에 **FIRST** 입력이 있어야합니다. 이것은 좋은 해결책이 아닙니다. 당신이 원하는 경우

는 내가 처음 printf 문이 실행됩니다 믿고

+0

ctrl + d 내 우분투 리눅스에서 EOF를 제공합니다 – NickO

+0

ctrl + Z는 Windows에서 EOF를 제공해야합니다. 그러나 조건이 있습니다.내 의견을 기반으로 내 게시물을 수정합니다. –

0

"키를 눌러 표시 시간을 누르면 시나리오를. 단지 간단한 방법 (AFAIK)이 없다", 그러나 때문에 버퍼링에 표시되지 않습니다 즉시 화면. fflush(stdout)을 사용하여 버퍼의 내용을 화면에 보냅니다. 즉 :

printf("\n Start pressing some keys!\n\n"); 
fflush(stdout); 
관련 문제