2013-07-12 3 views
-1

여러 공백을 하나의 공백으로 바꾸려고합니다.C에서 getchar() 함수로 고생

#include <stdio.h> 
#include <stdlib.h> 
#define MAXLINE 500 

main() { 
    char text[MAXLINE]; 
    int i; 

    for(i = 0; (text[i] = getchar()) != EOF && text[i] != 'x'; i++) { 
     if(text[i] == ' ') 
      i++; 

     while((text[i] = getchar()) != EOF && text[i] != 'x' && text[i] == ' '); 

     if(text[i] == EOF || text[i] == 'x') 
      break; 
    } 

    text[i] = '\0'; 

    printf("\n\n-- Result --\n%s", text); 
} 

나는 enter을 누른 후 getchar()가 문자를 기대하고 있다는 것을 알고 있지만, 나는 사람들이 EOF이 발견 될 때까지 전체 문자열을 얻기 위해 그것을 사용하는 방법을 여러 번 보았다. 이 예제에서조차도, 내가 while 루프를 주석 처리하면 작동합니다 (공백없이 한 단어를 쓰면 정확한 문자열을 얻습니다). 내가 원하는 것은 사람이 배열에 쓰는 모든 단일 문자를 넣는 것입니다. 이 경우에 getchar() 기능을 사용할 수 있습니까? 그렇다면이 코드가 작동하도록하려면이 코드를 변경해야합니까 (while 루프가 주석 처리되지 않은 경우) 일부 문자 만 인쇄되기 때문에 변경해야합니까? 내가 말했듯이, apple 또는 그와 비슷한 단어를 공백없이 그리고 while 루프없이 쓰면 작동한다.

+0

'main()'은'int'를 반환해야합니다. 그리고 오버 플로우 ('i Kninnug

+0

. 현재 문제가 해결되면이를 해결할 것입니다. – Stein

+1

'getchar()'은 매우 의사 소통적인 이름 임에도 불구하고'char'를 반환하지 않습니다 (http://linux.die.net/man/3/getchar) ('EOF'는 char에 맞지 않음). – unwind

답변

0

사용자 입력이 끝날 때까지 입력 내용을 모두 읽으려면 여러 줄에 걸쳐 나타나는 공백을 건너 뛰고 다음과 같이 입력하십시오. char에서 할 수있는 것보다 하나 개 더 많은 가치를 반환 할 할 수 있어야하기 때문에

#include <stdio.h> 
#include <stdlib.h> 
#define MAXLINE 500 

int main() { 
    char text[MAXLINE]; 
    int i; 
    int c; 

    c = getchar(); 
    for (i = 0; c != EOF && i < MAXLINE-1; ++i) { 
     text[i] = c; 

     if (c != ' ') { 
      c = getchar(); 
     } else { 
      while (c == ' ') 
       c = getchar(); 
     } 
    } 
    text[i] = '\0'; 

    printf("\n\n-- Result --\n%s", text); 
} 
+0

감사합니다. 'getchar' 구현으로 내가 뭘 잘못 했습니까? – Stein

+0

@decas 결과를'char'에 할당했습니다. 8 비트 바이트를 사용하는 전형적인 구현에서,'getchar'는 가능한 257 개의 다른 반환 값을 가지므로 결과는 손실없이'char'에 맞지 않습니다. –

+0

코드에서 공간이 발생할 때만 'i'가 증가하므로 모든 단어의 첫 번째 문자 배열을 얻을 수 있습니다. 'getchar()'의 결과를'char'에 저장하는 것도 잘못된 것입니다. –

0

getcharint 아닌 char 반환합니다. 느슨한 중요 정보가 있으므로 에 결과를 할당하는 것은 프로그래밍 오류입니다. char 일반 서명 또는 서명 여부를 숯불에 에게 그것을 할당 한 후 EOF 확인에 따라하면 EOF (일반 char 부호) 찾을 수 없다는 의미, 또는 것에 입력 (ÿ에 특정 문자 라틴어 1 , 일반적으로)는 EOF으로 처리됩니다.

C++에서

, 등가는 std::cin.get()이지만, 우리는 더 많은 은 일반적으로 다음처럼 작성할 수 있습니다 :

for (int i = 0; 
     i < sizeof(text) && std::cin.get(text[i]) && text[i] != 'x'; 
     ++ i) { 
    // ... 
} 

(물론, C++, 우리는 대부분 와 더불어, 표준 : : 문자열을 사용하십시오 .

: 단지 char 단일 또는 입력 int)가 그 모양 때문에

C (에서

는) 당신이 실제로 사용하고 무엇 당신은 여분의 중간 변수를 필요

int ch; 
for (int i = 0; 
     i < sizeof(text) && (ch = getchar()) != EOF && ch != 'x'; 
     ++ i) { 
    text[i] = ch; 
    // ... 
} 

두 언어 모두에서 첫 번째 조건 인 으로 경계 검사가 필요합니다. (C++에서는 std::string을 사용하는 경우 필요하지 않습니다.)

+0

예, 나는'EOF'가 -1이고 char를 사용하고 있다는 것을 기억하지 못했습니다. – Stein

+0

@decas'EOF'는 _usually_ -1입니다. 요구되는 것은 그것이 음수라는 것이다 (그리고'getchar'는'EOF' 또는'[0 ... UCHAR_MAX]'범위의 값을 반환한다). –

0

while 루프는 증가하지 않고 i을 읽습니다. 따라서 읽은 모든 문자는 실제로 다음 루프에서 덮어 쓰기 때문에 버려집니다. 그것은 단지 하나의 빈 여러 빈을 교체까지 당신이 이미 의견 statetd 그

char text[1024]; 
int i; 
int c; 

for(i = 0; i < sizeof(text)-1 && (c = getchar()) != EOF && c != 'x';) { 
    if(c != ' ' || i == 0 || text[i-1] != ' ') 
      text[i++] = c; 
} 

같은 일을 할 수 있는지 : 직접 그렇지 않은 경우에 읽을 바이트를 비교, 직접 숯불에 getchar()의 결과를 할당하지 마십시오 EOF는 아직 파일 끝에 도달하지 않았지만 사실이 될 수 있습니다.

+0

네, 공백이 하나 밖에 없기 때문에 공백을 버리고 있습니다. – Stein

+0

그러면 코드가 적절해야합니다. –