2016-11-05 63 views
-2

再次嘗試這裏。我想回答第1章的第22次練習,我想我被卡住了。試圖找出K&R C ex 1-22

練習是在最後一個非空白字符後創造性地摺疊一長行,但我所做的是吃掉字符串中的一些字符。

繼承人我的代碼:

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

您需要爲每個計數值設置line[count]。當a % LINEBREAK == 0時,您的代碼不會設置line[count]