2017-02-11 2 views
0

루프에서 getchar가()을 재현 I 성공적 한 각 캐릭터를 대체 출력에 를 입력을 복사하는 프로그램을 작성 수동 K & R 1-9

R 1.9

&을 K에 대한 답변을 재생하거나 하나의 공백으로 더 많은 공백.

내가 다음 코드는 다음

내가

c=getchar() 

는 동안 루프에 있기 때문에, 때마다 코드가 경우에를 통해 다음과 같은 완료 있다고 생각

#include <stdio.h> 

int main(void) 
{ 
int c; 
int inspace; 

    inspace = 0; 
    while((c = getchar()) != EOF) 
    { 
     if(c == ' ') 
     { 
      if(inspace == 0) 
      { 
       inspace = 1; 
       putchar(c); 
      } 
     } 

     /* We haven't met 'else' yet, so we have to be a little clumsy */ 
     if(c != ' ') 
     { 
      inspace = 0; 
      putchar(c); 
     } 
    }  
    return 0; 
} 

명령문을 입력하면 프로그램이 자동으로 사용자 입력을 요청합니다. 이 루프에서 퍼팅보다는 요구되는 자동 않도록

는 는

하지만, 내 이해를 테스트하기 위해, 내가 수동으로 각 문장의 끝에

c=getchar() 

을 넣어 원했고 그것은 나를 위해. 이것은 K & R의 저자가 K & R 초판의 16 페이지에있는 내용과 유사합니다. 나는 이것이 getchar()이 코드 전체에서 언제 호출되는지에 대한 나의 이해를 테스트 할 것이라고 생각한다. 그동안 루프에 넣어 반대로,

{ 
    int c; 

    c=getchar(); 
    while (c !=EOF) { 
     putchar(c); 
     c=getchar(); 
    } 
} 

제작자가 C = getchar가를 (되풀이)

다음은 16 페이지의 코드이다.

이것은 각 관련 문장의 끝 부분에 getchar()을 수동으로 삽입한다는 목표를 달성하기 위해 수정 한 코드입니다.

#include <stdio.h> 

main() 

{ 
int a; 
int b; 

b=0; 
a=getchar(); 

while(a!=EOF) 
     { 
     if(a==' ') 
       { 
       if(b==0) 
         { 
         putchar(a); 
         b=1; 
         a=getchar(); 
         } 
       if(b==1) 
         { 
         a=getchar(); 
         } 
       } 
     if(a!=' ') 
       { 
       putchar(a); 
       b=0; 
       a=getchar(); 
       } 
     } 
} 

파일을 컴파일하고 실행할 때 결과는 다음과 같습니다. 제가

hello my name 

입력하면 I가

hello 

수신 제가

hello my name 

(이것은 정확한 결과 수신

hello 

입력하면 더욱있을 때 하나의 공백보다 성명서에서 공백의 수는 1로 줄어 듭니다.

는 이유는 무엇입니까 :

hello my name 

나는

hello y ame 

내 질문은 다음과 같다 나타납니다 내가 입력하면 각 단어 사이에 두 개의 공백)

는, 그러나이 있음을 유의하시기 바랍니다 공백 다음의 문자는 내 코드에서 잘립니다.

가 (이 코드는 과도하게 긴 난 단지 내가 책 K & R 1.9까지 배운 문법을 사용하고 있기 때문에 될 수있다)

+2

? "이유는 무엇입니까 내 코드에 의해 잘릴 공백 다음 문자":

불필요한 코드를

를 제거 다음은 결과입니다. 질문이 너무 깁니다. 마지막 코드를 보여주고 그 질문을하십시오. 우리는 모든 배경 지식과 정보를 필요로하지 않습니다. 그것은 단지 질문을 모호하게하고 사람들이 관련없는 모든 것을 통과해야만 응답을하지 못하게합니다. – kaylum

+0

조언 해 주셔서 감사합니다. 다음 번에해야 할 것입니다. –

+0

과 상관없이 일부 마이크로 소프트 컴파일러가 허용하는 것 (예 : Visual Studio)은 읽기 쉽고 이해하기 쉽도록'main()'의 리턴 유형은 항상'int' – user3629249

답변

4

귀하의 일반적인 문제는 여러 if 문을 사용하고 있는지 때해야 대체 상황을 처리하려면 else을 사용하십시오. 예를 들어, 당신은 다음 b0, 첫 번째 블록이 실행되면 첫 번째 블록이 b = 1;을했기 때문에

  if(b==0) 
      { 
       putchar(a); 
       b=1; 
       a=getchar(); 
      } 
      if(b==1) 
      { 
       a=getchar(); 
      } 

는 다음 두 번째 블록도 실행합니다. 두 번째 블록은 else이어야하며 첫 번째 블록이 실행되지 않을 때만 실행됩니다. 첫 번째 if 블록에 a를 재 할당하기 때문에

동일

if (a = ' ') 

if (a != ' ') 

마찬가지입니다. 서식 (양식) 제안

코드에서 논리 문제의 원인이 무엇 getchar()에 불필요한 호출을 제거를 적용

+1

문제를 해결 한 것 같아서 고맙습니다. 'else'없이 수동으로 getchars()를 입력하여 응답을 생성 할 수 있습니까? ('그 외'는 아직 책에 소개되지 않았다.) –

+1

추가 변수를 사용하여 이미 이전 'if'블록에 들어 갔는지 여부를 추적 할 수 있습니다. – Barmar

0

.

#include <stdio.h> 

int main(void) 
{ 
    int a; 
    int b; 

    b=0; 
    a=getchar(); // primes the 'pump' 

    while(a != EOF) 
    { // then process the current char 

     // note: following does nothing if prior char was a space 
     if(a==' ') 
     { 
      if(b==0) 
      { 
       putchar(a); 
       b=1; 
      } 
     } 

     // if current char is not a space 
     if(a!=' ') 
     { 
      putchar(a); 
      b=0; 
     } 

     // replace prior char with a new char, to keep the 'pump' running 
     a=getchar(); 
    } // end while 
} // end function: main