2014-10-04 2 views
1

문자열, 기호 및 단어를 계산하는 간단한 프로그램입니다.getchar()는 EOF를 전달하지 않고 Ctrl + Z는 Cygwin에서 프로그램을 종료하지 않습니다.

Cygwin을 사용하여 모든 계산이 정상입니다.

그러나 입력 값을 입력 한 후 프로그램은 nc, nw, nl을 인쇄하지 않으며 추가 값 입력을 기다립니다.

EOF에서 13 (Enter)으로 변경하는 것은 도움이되지 않습니다.

Ctrl 키를 + Z도 유용하다 : 프로그램이 'n은'항상 다른 번호 [n]+ Stopped를, 쓰기, 정지된다.

코드는

#include <stdio.h> 
#define IN 1 
#define OUT 0 


int main() { 

    char c; 
    int state; 
    int nc, nw, nl; 
    state = OUT;  

    while ((c=getchar()) != EOF) { 
     nc++; 

     if (c == 'n') 
      nw++; 


     if (c == '\n' || c == ' ' || c == '\t') 
      state = OUT; 
     else if (state = OUT){ 
      state = IN; 
      nw++; 
     } 

    } 
    printf ("%d %d %d", nc, nl, nw); 
} 
+1

무엇이 문제입니까? –

+0

경고 : 사용되지 않는 변수'nl'! –

+2

'int c;' –

답변

4

getchar은 이 아니라 char입니다. 문자 값을 반환하거나 특수 값 EOF을 반환하여 입력 파일의 끝을 나타낼 수 있기 때문에이 작업을 수행해야합니다. EOFchar 유형의 모든 값과 달라야하므로 유형은 char이 아닙니다.따라서 반환 값이 포함 된 변수를 이 아닌 char이 아닌 변수로 정의해야합니다.

일부 플랫폼에서는 char 유형이 서명되고 getchar 함수는 실제로 문자 값을 반환하지 않지만 문자 값은 음수가 아닌 값으로 감싸집니다. 실제로 이것은 ASCII 문자는 변경되지 않지만 일부 플랫폼에서는 비 ASCII 문자가 -128과 -1 사이가 아닌 128에서 255 사이의 값으로 변환된다는 것을 의미합니다. 따라서 일반적으로 getchar의 반환 값을 문자로 사용할 때는 char으로 변환해야합니다. char 형식이 서명되지 않은 플랫폼에서는 아무 것도 변경되지 않지만 char 형식이 서명 된 플랫폼에서는 문자 255가 파일의 끝으로 오인되는 것을 피할 필요가 있습니다. 라인의 처음에 다른 유닉스 시스템 눌러 Ctrl 키 D + 상기 입력의 종료를 신호처럼 시그윈에서

int c; 
… 
while ((c = getchar()) != EOF) { 
    … 
    if (c == 'n') /* ok because 'n' is part of ASCII and thus always positive */ 
     … 
    if ((char)c == some_other_char) /*cast needed in general*/ 
     … 
} 

. Windows에서는 Ctrl + Z (다른 유닉스 계열 시스템과 마찬가지로 Cygwin에서 다시 프로그램을 일시 중단하는 대신 정지가되지만 bg 명령으로 다시 시작할 수 있음)을 눌러야합니다. 이들 중 어느 것도 프로그램에 제어 문자를 보내지 않고 C의 getchar 구현이 EOF 값으로 변환되는 파일 끝 표시를 보냅니다.

+0

자세한 답변 해 주셔서 감사합니다.그러나 어쨌든 ctrl + D는 도움이되지 않습니다. 내가 Ctrl + D 키를 눌러 오른쪽으로 들어간 다음 입력을 시작한 다음 Enter 키를 누르십니까? –

+0

@DanielChepenko 아니요, Enter 키를 누른 다음 Ctrl + D를 누릅니다. – Gilles

+0

@mafso Wooops. 너무 오랫동안 임베디드 작업을 해왔습니다 ... ('stdio'? 너무 높은 수준!) 고마워. – Gilles

1

당신이 계산하는 데 사용하는 변수를 초기화입니다 :

int nc = 0, nw = 0, nl = 0; 

당신은 그들이 임의의 값을 얻을하지 않습니다

.

또한 단어 집계 논리가 잘못되었습니다.

else if (state = OUT)은 아마도 else if (state == OUT)을 의미합니다.

+0

초기화가 변경되었습니다. 어쨌든 도움이되지 않습니다. 논리에 어떤 문제가 있습니까? –

+0

첫 번째 조건에서 nw을 nw로 변경하면 오류가 발견되고 else 상태 인 경우 상태 == Out –

+0

그러나 문제가 해결되지 않는 경우 –

0

여기에 버그가 거의 없습니다.

int nc, nw, nl; 

int nc = 0, nw = 0, nl = 0; 


else if (state = OUT){ 

일해야 당신이

else if (state == OUT) { 

은 Cygwin에서 -1을 반환 파일의 끝 부분에 10하지 (13)

getchar가()이다 ENTER 의미 생각 (나는 왜 그런지 모르겠다). 따라서 EOF를 -1로 바꿀 수 있습니다. 당신은 당신의 프로그램이 방법을 테스트 할 수 있습니다

1
#include <stdio.h> 
#define IN 1 
#define OUT 0 
int main() 
{ 
    int c, nl, nw, nc, state; //c is an int not a char   
    state = OUT; 
    nl = nw = nc = 0; // initialize variables to 0 
    while ((c = getchar()) != EOF) { 
     ++nc; 
     if (c == '\n') // if c is a newline character 
      ++nl;  //increment no of lines 
     if (c == ' ' || c == '\n' || c == '\t') 
      state = OUT; 
     else if (state == OUT) // == for comparing 
     { 
      state = IN; 
      ++nw; 
     } 
    } 
    printf("%d %d %d\n", nl, nw, nc); 
return 0; 
} 

여러분의 프로그램이 위의 하나처럼 보이도록되어있다 < inputfilename ./program.exe. cgetcharunsigned char에 입력 변환과 음수 값을 보유 할 수 없기 때문에 EOF과 -1을 보유하고 있기 때문에, 루프 while 끝나지 않을 것이다 char 때문에 int와 아니다.

Ctrl 키를 누른 채로 Ctrl + Z를 누르면 (Windows에서 Ctrl + D) 누르면 이 stdin에 나타나므로 종료됩니다.

+0

"왜냐하면'char'는 기본적으로 서명 되었기 때문입니다. - 서명 된 경우 구현에 달려 있습니다. 'getchar'와 비슷한 함수는 읽은 문자를'unsigned char'로 변환하여'EOF'와는 양수로 구분합니다 (보통 -1입니다 만, 표준은 음수 일 필요가 있습니다). – mafso

+0

@mafso, 맞아. 하지만 지금 나는 혼란스러워! 'getchar()'는 입력을'unsigned char'로 변환합니까? 그리고 -1 (EOF)을 가질 수 없으므로'int'를 사용합니까? –

+1

예. 8 비트'char'을 사용하면 -1 값을 갖는 파일의 문자는'0xFF'로 변환되어'EOF'와 ('int'와) 구분됩니다. – mafso

0

이 문제가 계속 발생합니까? 일부 문자를 입력하고 ctrl-z를 누르면 그 문자가 정상적인 문자 (코드 26)로 계산되지만 줄의 처음에는 의미가 있습니다 (의미 : 아무 것도 입력하지 않고 ctrl-z char)는 EOF로 간주됩니다. 그래서 :

이렇게하면 ctrl-z char을 입력하면 문제가 없습니다. 반복이 끝납니다.

관련 문제