2016-11-05 3 views
-2

Noobをもう一度見ようとしています。私は第1章の第22練習問題に答えようとしており、私は立ち往生していると思います。K&R C ex 1-22

最後の空白以外の文字の後に長い行を折りたたんで作成していますが、私が行ったことは文字列中のいくつかの文字を食べることです。

HERESに私のコード:

int folder(char line[], int limit) 
{ 
    int count = 0; 
    int c, a, mod_a; 
    mod_a = 0; 
    a = 0; 

    while((c = getchar()) != EOF && c != '\n' && count < limit - 1) 
    { 
     ++a; 
     mod_a = a % LINEBREAK; 

     switch(mod_a){ 
      case 0: 
       while(a >= count - LINEBREAK + 1) 
       { 
        --a; 
        if(line[a] == ' ' || line[a] == '\t') 
        { 
         line[a] = '\n'; 
        } 
        else 
         continue; 
       } 
       a = count; 
       break; 
      default: 
       line[count] = c; 
       break; 
     } 
     ++count; 
    } 

    line[count + 1] = '\0'; 

    printf("\""); 
    for(int each = 0; each < count; ++each) 
     printf("%c", line[each]); 
    printf("\""); 
    printf("\n"); 

    return count; 
} 

私はLINEBREAK = 5を選択すると、私は次を得る:

./ex1-22 
this is a line 
"thiss 
a 
ine" 

私は行方不明の文字に何が起こっているのか理解しません。 私は間違って何をしていますか?

+0

余分なコードがたくさんあることがわかりますか? 'else'ブランチで' continue'と同様に、ループは何をしますか? 'continue'とは無関係に次の繰り返しに行き、' switch'文は単にif(mod_a%LINEBREAK == 0){} else {} '!!!です。 –

+0

欠けている文字はゼロです。 "line"を "XXXXXXXXXXXXXXXXXX ..."に初期化すると、出力が得られます: "thisXXs {newline} a {newline} Xline"(書式化の言い訳:) – Buster

答えて

0

countの値ごとにline[count]を設定する必要があります。 a % LINEBREAK == 0の場合、コードはline[count]に設定されません。

関連する問題