2013-06-25 187 views
0

我必須從用戶那裏獲得輸入,將其放入管道中(在父進程中),然後我必須處理子進程中的字符串。所有大寫字母都必須小寫,所有小寫字母必須大寫。我的問題是與管道的輸出。我的代碼只會改變字符串中第一個字符的字母大小寫,我不知道爲什麼。孩子管道正在閱讀所有的字符(至少它看起來是)。我希望有人能告訴我爲什麼這不會處理每個角色。管道讀取處理

while (read(pfd[0], &buf, strlen(cmd)) > 0){ 
    if(buf >= 'a' && buf <= 'z'){ 
     buf = toupper(buf); 
    } 
    else{ 
     buf = tolower(buf); 
    } 
} 

write(STDOUT_FILENO, &buf, strlen(cmd)); 

回答

0

你做兩個常見的錯誤。

(1)read不會爲您緩衝,所以您不能保證獲得len字節(即在您的情況下爲strtrlen(cmd))。 read將返回任何可用的字節數您指定的長度,但它可以並且通常會返回更少。所以你想改變你的閱讀循環來反映這一點。

(2)buf大概是一個char數組。你總是改變第一個字節,只有第一個字節。你需要遍歷你剛纔讀的所有字節。

所以把他們放在一起,像

while ((bytesread = read(pfd[0], &buf, strlen(cmd))) > 0) 
{ 
    for (int i = 0; i < bytesread; ++i) 
    { 
     if(buf[i] >= 'a' && buf[i] <= 'z') 
      buf[i] = toupper(buf[i]); 
     else 
      buf[i] = tolower(buf[i]);    
    } 

    write(STDOUT_FILENO, &buf, bytesread); 
} 
+0

是有道理的,但BUF被定義爲char BUF;它不是一個數組或指針。 –

+0

也,我只是改變了buf的定義是一個數組,它完美的作品。希望我沒有被告知它必須是單個字符而不是數組! –

+0

那麼如果你真的需要讀入一個字節,那麼你原來應該工作。您只需將其更改爲每次讀取一個字節而不是strlen(cmd)字節。但說實話,這是有點明智的效率。 – Duck