2017-04-22 5 views
1

に1つのより少ないスペースを取得していますスペースキーがあること聞かせて - 私が入力したキーボードの場合:出力は、私がトレースしているは、なぜ私は大会のために私のCコード

J----a 

ある

J-----a 

私のプログラムはペンと紙を使って何度も何度もやります。

J'\t'--a 

私はt彼キーボードはなぜ出力

J----a 

コードされています4;として

/*************************************************** 
* Replacing spaces with appropriate tabs an  * 
* spaces to achieve the same effect      * 
*                      * 
***************************************************/ 
#include <stdio.h> 
#define TAB 4; 

int main(void) 
{ 
    int ch; 
    int printPos=0; 
    int chpos=-1; 
    int space2tab; 

    while((ch=getchar()) !='@') 
    { 
       chpos++; 
      if(ch!=' ') 
      { 
       space2tab = TAB- printPos % TAB;  
       while(printPos+space2tab <= chpos) 
       { 
        putchar('\t'); 
        printPos+=space2tab; 
        space2tab = TAB- printPos % TAB;  
       } 
       while(printPos<chpos) 
       { 
        putchar(' '); 
        printPos++; 
       } 
       if(printPos==chpos) 
       { 
        putchar(ch); 
        printPos++; 
       } 
      } 
    } 
    return 0; 
} 
+1

'場合、 '、それ'space2tab = 4; - printPos%4 ;;' – InternetAussie

+0

あなたのコンパイラは、 'TAB'を使って行に' '何の効果もない' 'のような警告があったはずです。あなたのコンパイラ警告に注意を払う;彼らはあなたのコードにバグを報告しています。そのような警告が表示されない場合は、十分な警告オプションを有効にしてコンパイルしていませんでした。 GCCを使用している場合は、 'gcc -Wall -Werror'を考慮してください。' -Wextra'といくつかのものを追加したいと思います。 –

+0

改行の後に 'printpos'を0に戻すことは決してありません。改行は他の文字とは違って扱われません。空白を含む行を開始または終了すると、興味深い結果が得られます。また、EOFも検出しません。外部ループ条件に '&& ch!= EOF'を追加する必要があります。 –

答えて

3
#define TAB 4; 

がトークンTABを定義 - セミコロンはが含まれている。これは

space2tab = TAB- printPos % TAB;  

はあなたが望んでいないものを最も可能性が高いです

space2tab = 4; -printPos % 4;; 

...として展開されていることを意味します。

-printPos % 4は破棄され、有効な式である。)


定義TAB代わり4として:TAB`は `4のように定義される

#define TAB 4 
+0

ありがとう、私はそれに気づいていませんでしたが、私はまだ同じ問題があります。 – Simple

関連する問題