2012-07-22 28 views
0

我正在通過K & R讀取,問題是:編寫一個程序將其輸入複製到其輸出,用一個空白替換一個或多個空白的每個字符串。在我看來,我想我知道我需要做什麼,設置一個布爾值來知道我什麼時候在一個空間裏。我嘗試過它並沒有成功。我發現這個代碼,它的工作原理,我正在努力弄清楚是什麼阻止了寫入的空間。我想我可能擁有它,但我需要澄清。限制空間只有一個在文本中 - c

#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; 
} 

我創建了一個文本文件上下工夫,文曰:

so this is where you have been 

上「這」狀態更改爲1的「s」之後,因爲我們是在一個空間。空間被寫入並讀取下一個空間。所以現在我們輸入:

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

但是inspace不是0,它是1.那麼會發生什麼?代碼是否跳過返回0 ;,不寫任何東西,只是繼續while循環?返回0;是在循環之外,但這是我可以看到一個值沒有被返回的唯一方法。

+0

它跳到''如果它跳過太多,繼續循環(C ='「!)。你可以看到'putchar(c)'(回顯輸入)只在沒有空格(第二個if)或空格(第一個if)和inspace = 0時完成。其中'inspace'的意思是「在讀取空格之前」 。 – 2012-07-22 16:47:38

+0

說「我們還沒遇到別的東西」是荒謬的;該死的很好介紹'else'在這一點上,以防止這種荒謬的迂迴。 – 2012-07-22 16:47:45

回答

5

此時:

if(c == ' ') 
{ 
    if(inspace == 0) // <-- here 

如果inspace等於1,也不會執行,如果體內,就會跳轉到:

if(c != ' ') { 

而作爲只要上面的c =='將是假的,所以它會跳過if body並跳轉到:

while((c = getchar()) != EOF) { 

而且這會持續到t他結束文件或直到(c != ' ')評估爲真。當c是非空格時:

if(c != ' ') 
{ 
    inspace = 0; 
    putchar(c); 

將空格置零,並打印字符。

+1

更清晰了,謝謝 – bigl 2012-07-22 16:50:47

0

是的,在你提到的情況下,它不會寫任何東西,並在while循環中繼續並獲取下一個字符。如果下一個字符再次是空格,那麼它將執行相同的操作,即進行下一次迭代而不打印。每當它找到第一個非空格時,它會將空格設置爲0並開始打印。

while循環將終止,只要getchar將獲取EOF。然後程序會返回0

0

如果if語句中的條件不成立,則不執行以下表達式。這意味着相應括號內的所有內容都會被跳過,並且執行會在'括號後'恢復。

由於下面的if語句也是錯誤的,所以在for循環的迭代中沒有做任何事情。

0

當inspace爲1和c爲 '' 的表達式:

inspace == 0 

的計算結果爲0以及將碼

inspace = 1; 
putchar(c); 

沒有得到執行。

如果可以,程序將轉到while循環的下一個迭代,但直到while循環結束時纔會返回0。

可以簡化while循環驗證碼:

while((c = getchar()) != EOF) 
{ 
    if(c == ' ') 
    { 
    if(inspace == 0) 
    { 
     inspace = 1; 
     putchar(c); 
    } 
    } else 
    { 
    inspace = 0; 
    putchar(c); 
    } 
} 
相關問題