2010-02-14 2 views
4

지금 나는 C 책을 읽으며 책에 나오는 예를 발견 할 수 있습니다.입력 내에서 줄 수, 단어 수 및 문자 수를 계산하십시오.

#include <stdio.h> 
#define IN 1 
#define OUT 0 
main() 
{ 
    int c, nl, nw, nc, state; 
    state = OUT; 
    nl = nw = nc = 0; 
    while ((c = getchar()) != EOF) { 
    ++nc; 
    if (c == '\n') 
     ++nl; 
    if (c == ' ' || c == '\n' || c == '\t') 
     state = OUT; 
    else if (state == OUT) { 
     state = IN; 
     ++nw; 
    } 
    } 
    printf("%d %d %d\n", nl, nw, nc); 
} 

입력 내용 내에서 줄 수, 단어 수 및 문자 수를 계산합니다. 그러나 터미널에서 실행할 때 아무 것도하지 않는 것처럼 보입니다. 뭔가 빠졌거나이 코드에 문제가 있습니까?

+0

다음은 좋은 연습입니다. if 문 대신 switch 문을 사용하여 코드를 다시 작성하십시오. 결과는 더 명확한 코드가됩니다. 보다 길고 자세한 설명이 포함 된 이름 (예 :'IN_WORD', 'charCount','wordCount')을 사용하면 더 명확한 코드가 생성됩니다. – outis

+1

콘솔 I/O 대신 실제 파일을 stdin으로 리디렉션하여 코드를 실행하십시오. 예; 명령 행에서 myprog Clifford

+0

마지막 문자가 개행 문자가 아니고 파일이 비어 있지 않으면 행 수가 1 씩 증가합니다. – chqrlie

답변

8

입력이 끝나면 프로그램이 종료됩니다 (getchar는 EOF를 반환합니다). 터미널에서 실행될 때, 이것은 일반적으로 일어나지 않으며 이것 때문에 프로그램이 멈춘 것 같습니다. Linux에서는 Ctrl + D (가능하면 두 번)를 누르거나 Windows의 경우 줄 시작 부분에 F6과 Enter 키를 눌러 입력을 수동으로 닫아야합니다 (다른 시스템에서는이 방법이 다를 수 있음).

+0

의심의 여지가 당신이 맞아 Ctrl-Z Windows 및 MS-DOS FYI, 난해 역사 CP/M 호환성 이유로 그것은 EOF 문자로 사용되는 Windows 용이 F6 사용 된 적이 MS-DOS에서는 Windows에서 상속받습니다. – Clifford

2

실행할 때 텍스트를 입력하고 return을 누른 다음 Ctrl-dreturn (줄이 없음)을 입력하여 파일 끝을 의미해야합니다. 내 간단한 테스트로 잘 작동하는 것 같습니다.

2

입력 할 루프를 입력하는 것입니다. 문자 나 개행 문자를 입력하면 화면에 아무 것도 나타나지 않습니다. 당신은 EOF로 사용되는 프로세스를 중단해야합니다 (내 Mac에서는 CTRL + D). 그런 다음 결과를 얻습니다.

+0

아, 파일 끝으로 루프를 수동으로 중지해야한다는 것을 알지 못했습니다. 빠른 답변 감사합니다. – Pax

+1

질문을하기 전에 잠시 기다려야합니다. 그냥 생각 ... –

3

표준 입력을 기다리고 있습니다. 파일을 파일로 리디렉션하거나 (myprog < test.txt) 데이터를 입력하고 Ctrl-D (* nix) 또는 Ctrl-Z (Windows)를 누릅니다.

2

getchar() 표준 입력에서 입력을 반환합니다. 단어 수와 줄 수를 입력 할 텍스트를 입력하십시오. CTRL D를 치면 EOF에 도달하면 입력이 종료됩니다.

이 경우 CTRL D는 전송 종료 문자의 역할을합니다.

환호

나는 보통 (리눅스 용)이 같은 입력 이런 종류의 처리
0

: 1. 파일을 (예를 들어, "input.txt를"라는 이름의), 입력 내용을 입력하고 2. 저장을

cat input.txt | ./a.out 

당신이 프로그램이 제대로 실행 볼 수 있습니다 : 파이프 응용 프로그램에 텍스트를 보내려면 (여기 "의 a.out"현재 디렉토리에라는 이름의 응용 프로그램을 가정).

관련 문제