2010-01-04 7 views
4

저는 제 자신을 C & R에서 가르치려고 노력하는 합계 C n00b입니다. 제 질문은 당황스럽게 초등 학생입니다. 좋아, 여기 간다. 나는 getchar을 사용하여 예상 한 결과물을주는 프로그램을 얻을 수 없다. 손에 K & R이있는 경우 운동 1.13에 붙어 있습니다. 질문은 "입력에 단어의 길이에 대한 히스토그램을 인쇄하는 프로그램을 작성하십시오."라고하며,이 문제로 인해 수평 버전을 처리 할조차 수 없습니다.getchar을 사용하여 프로그램을 실행하려면 어떻게해야합니까?

저는 Dev-C++ (mingW 컴파일러)를 사용하고 명령 줄에서 프로그램을 실행하면서 XP를 사용하고 있습니다. 내 문제는 프로그램을 실행하려고 할 때 스캔 할 문자를 입력 할 때까지 기다리지 만 입력을 완료하고 Enter를 누르면 아무 것도 수행하지 않습니다.. 기대했던대로 히스토그램을 인쇄 할 것을 기대합니다. 실제로 코드에서 볼 수 있듯이 ctr 배열에있는 내용을 인쇄하려고하면 아무것도 들어 있지 않은지 확인할 수 있기 때문에 단어 길이를 계산하는 것조차 보이지 않습니다. 아무 것도 인쇄되지 않습니다.

나는 그것이 내 코드인지 잘못인지 명령 줄인지 전혀 모르겠다. 그러나 컴파일 할 때 a model program을 실행하려고 할 때 동일한 문제가 발생하기 때문에 시스템과 관련이 있다고 생각합니다. 입력을 입력하고 Enter 키를 누르면 아무 일도 일어나지 않습니다. Ctrl-C를 누르면, 가끔씩 별표가 나오거나 모델 출력처럼 보이지 않는 두 개가 튀어 나옵니다. 다른 때에는 아무 것도하지 않습니다 (바로 프롬프트로 바로 돌아갑니다).

다음은 연습용 코드입니다. 나는 이것에 하루 종일을 보냈으며 프로그래밍을 계속할 수있는 능력에 대해 질문하고 있습니다. 만약 누군가가 나를이 구멍에서 빠져 나올 수 있다면 정말로 고맙겠습니다!

또한 위에서 언급 한 모델 프로그램에 대한 또 다른 질문이 있지만 자체 질문에 게시해야한다고 생각합니다. 모두 감사합니다.

#include <stdio.h> 

//#define 1 IN 
//#define 0 OUT 
int main() { 
    //start w/ state = OUT 
    int c = 0; 
// int state = OUT; 
    int len = 0; 
    int ctr[12]; 
    int i, j; 
    i = j = 0; 

    for (i = 0; i <12; i++) 
     ctr[i] = 0; 
    while ((c = getchar()) != EOF) 
     if (c != ' ' && c != '\t' && c != '\n') { 
//   state = IN; 
      len++; 
      printf("%d", len); 
      } 
     else { 
      ctr[len]++; 
      len = 0; 
      }    
    for (i = 0; i <12; i++) 
     printf("%d\n", ctr[i]); 
    for (i = 0; i <12; i++) { 
     printf("%d\n", i); 
     for (j = 0; j <= ctr[i]; j++) 
      printf("-"); 
     printf("\n"); 
     } 
    return 0; 
} 
+1

문제는 없지만 DevC++를 고려해야합니다. 그것은 버그가 있으며 더 이상 개발되지 않습니다. 훌륭한 FOSS 대안은 Code :: Blocks (http://www.codeblocks.org)입니다. 하지만 내가 말했듯이, 이것은 당신의 문제와 아무런 관련이 없다. IDE를 바꾸면 문제가 해결되지 않을 것이다. –

+0

나는 CB를 잠시 동안 가지고 있었다. 당신은 그것을 믿지 않을 것입니다, 그러나 단순히 * 사용하는 방법을 몰랐을 때가 왔습니다 : | 특히 디버깅 기능 : 일부 심하게 잘못된 버튼을 클릭하면 내 코드의 오류 목록이 나에게 표시되지 않습니다. 문서를 파고 며칠 만에, 나는 포기하고 내 길을 알고있는 유일한 IDE로 돌아갔습니다. D –

+0

아니타, 그 얘기를 들으니 유감스럽게 생각합니다. http://forums.codeblocks.org에서 문제를 묻는 질문을 시도 했습니까? 아니면 여기에 질문을 게시 해 볼 수도 있습니다. 솔직히, DevC++보다 더 좋은 것이 있어야합니다. –

답변

7

while 루프는 EOF (EOF)를 찾고 있습니다.이 EOF는 파일 끝 (end-of-file)을 나타내며 줄 끝이 아닙니다.

Windows에서는 ctrl-z를 입력하여 파일 끝을 시뮬레이트해야합니다.

+0

아! 그게 다야! 그 책들은 내게 이렇게 말하지 않았다. 나는 당신이 따라 오지 않았다면 내가이 "재미있는 사실"을 결국 배울 수 있을지 궁금해. 고마워요! –

+1

K & R과 동일한 동작을 원하면 virtualbox에서 Linux를 실행하면 도움이됩니다. D –

+0

제안에 감사드립니다! 방금 virtualbox를 보았습니다. 나는 정보 과부하의 가벼운 사건을 여기에서 가지고있다. 젠장,이 학습 곡선. –

1

실제로 어디서나 C (사용자의 입력)를 저장하고있는 것처럼 보이지 않으며 인쇄하지 않습니다. 문자열의 크기는 인쇄하지만 실제 문자는 인쇄하지 않습니다. 당신 ctr [i] = c; 어딘가에 (그 배열에 문자를 추가하는), 다음 배열을 인쇄하면 입력을 볼 수 있습니다. 오, 예, ctrl-z에 대한 대답도 중요합니다. 또한 언어를 처음 접하는 사용자는 while 콘텐츠를 대괄호로 묶어 두는 것이 좋습니다. 코드를 한눈에 볼 수 있고 while 루프의 범위에 무엇이 들어갈 지 알 수 있고 주위에 괄호가없는 경우에는 무엇을하지 않을지 알기까지는 어느 정도 시간이 걸릴 것입니다.

+0

나는 당신이 의미하는 바를 얻지 못한다는 것을 두려워합니다 - 어쩌면 의역을 부탁드립니다. 감사! 배열을 반복하고 그 내용을 인쇄하는 부분에 대해 이야기하고 있다면, 실제로는 관심있는 각 단어의 문자 수입니다 (단어 연습 자체는 아닙니다. 연습은 단어 길이의 히스토그램). –

+1

아 ... 알 겠어. 좋아, 그렇다면 내 게시물에서 빼내는 유일한 방법은 대괄호에 관한 것입니다. while (1) {물건은 여기에있다.}; 귀하의 예제에서 당신은 대괄호없이 귀하의 다음과 같은 if/else 있습니다. 오래된 학교 C는 이것을 허용하지 않았지만 C++을 알고있는 최신 컴파일러는 괜찮습니다. 난 단지 당신이 언어를 알게되는 동안 적어도 필수는 아니더라도 중괄호를 사용해야한다고 말하고 있습니다. 왜냐하면 여러분은 (1) {do stuff; 더 많은 것들을해라;} while (1) do suff; 더 많은 일을; 그것은 비슷하지만 매우 다릅니다. –

+0

매우 사실입니다. 사실 어제 한 시간 씩 어쩔 수없이 다른 조건을 추적하여 보았습니다.이 조건은 야생에서 사라졌습니다 (이 문장은 한 문장으로 시작되었지만 나중에 괄호를 추가하지 않아도 확장되었습니다). 그럴거야 - 감사합니다 :) –

1

코드에 아무런 이상이 보이지 않아서 gcc에서 코드를로드 했으므로 종료 할 때 EOF (CTRL-D)를 사용해야한다는 것을 기억하는 한 잘 작동하는 것 같습니다. while 루프. 나는 4 줄을 입력했고 답변의 정확성에 대해 언급 할 수는 없지만 입력 할 때마다 내가 입력 한 문자 수와 동일한 일련의 숫자를 얻었고 그 다음에 공백이옵니다. 이것은 코드가 말하는 것과 정확히 같습니다.

CTRL-D를 입력하면 요약 정보를 얻었습니다. 다시 말하지만 출력의 정확성에 대해 언급하지는 않겠지 만 코드에 설명 된대로 두 가지 주요 섹션을 얻었습니다.

+0

정렬의 막대 그래프 (대시)를 인쇄합니까? 너무 굉장합니다. 현재 프로그램을 테스트 할 방법이 없습니다. 또한 우분투에 있다고 가정합니다. Windows에서의 EOF 시뮬레이션은 분명히 Ctrl-Z이기 때문에. –

+0

예, 일종의 히스토그램을 인쇄했습니다. 내가 말했듯이, 나는 출력을 검증하려고 시도조차하지 않았다. 내 환경은 실제로 Windows 7에서 Cygwin입니다. 개발 키트를 설치하면 gcc, gdb 등을 얻을 수 있습니다. X 서버를 시작하고 GUI 작업을 수행 할 수도 있습니다. – jfawcett

관련 문제