2013-05-24 3 views
1

나는 당신이 아마 너무 많이 들었던 것처럼 스스로 C를 가르치려고하고 있으며, 내가 뭘 잘못하고 있는지 알 수 없다. 내가하고있는 운동의 요점은 탭을 지정된 수의 공백으로 대체하는 것입니다. 그것은 unix 명령 확장을 모방 한 것으로되어 있습니다. 여기에 지금까지 가지고 무엇을 : 나는 그것을 실행하고 (나는 GNU/리눅스를 사용하고 있기 때문에), Ctrl + D를 쳐서 입력, 마무리를 시작하고 가비지 문자를 인쇄 할 수있게된다putchar()을 사용하여 왜 쓰레기를 인쇄하고 있습니까? 이 for 루프에서?

#include <stdio.h> 

int main (int argc, char *argv[]) 
{ 
    int spacecount = atoi(argv[2]); 
    int i, d, b, g, toput; 
    char string[1000]; 

    for (d = 0, b = 0; (string[d + b] = getchar()) != EOF; d++) { 
     if (string[d + b] = '\t') { 
      toput = d % spacecount; 
      for (i = 0; i < toput; i++) { 
       if (string[d + b] = '\n') 
        i = toput; 
       string[d + b] = ' '; 
       b++; 
      } 
     } 
    } 
    g = d; 

    putchar('\n'); 

    for (d = 0; d < g; d++) 
     putchar(string[d]); 
    putchar('\n'); 
} 

. 나는 for 문없이 for 루프에서 getchar()을 할당받은 다른 문자열을 가지고 동일한 초를 반복했다. 그리고 가비지가 아닌 문자를 출력한다. 나는 정말로 혼란 스럽다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+2

사용 이용해 '='로서위한 서명,'=='은 비교를위한 것입니다. 둘을 섞어 쓰지 마라! –

+0

물론! 고맙습니다. – Karelisadog

답변

3

컴파일러에서 경고를 사용하도록 설정하면이 코드에 대한 경고가 표시됩니다.

(string[d + b] = '\t')(string[d + b] == '\t')이어야합니다.

gcc -std=c99 -pedantic-errors -Wall으로 컴파일하십시오.

+0

+1은 대리인을 위해서 대답을 던지기위한 것이 아닙니다. OP는 자신을 더 가르 칠 수있는 올바른 컴파일러 옵션을 제공하는 자체 학습 C입니다. – legends2k

0

== 대신 = 연산자를 사용하여 비교하는 것이 문제입니다. =은 asign 연산자이므로 두 요소를 비교하는 데 사용할 수 없습니다.

그래서

if (string[d + b] == '\t') 

대신

if (string[d + b] = '\t') 

또한

if (string[d + b] == '\n') 

대신

if (string[d + b] = '\n')