2013-08-23 62 views
0

我在Linux中遇到了管道問題。看起來像管道後空間字符丟失。從爲什麼Linux中的管道中的空間會丟失?

echo "ab cd" | ./checker 

shell命令運行下面的代碼C++

#include <iostream> 
#include <stdio.h> 
#include <string.h> 

using namespace std; 

int main(){ 
    char s[] = "ab cd", c; 
    int n = strlen(s); 
    for(int i = 0; i<n && (cin >> c); i++) 
     if(s[i] != c){ 
      printf("wrong at %d : '%c' != '%c' \n", i, s[i], c); 
      break; 
     } 
    return 0; 
} 

wrong at 2 : ' ' != 'c' 

這是正常的行爲呢?如何避免丟失管道中的字符?

+1

由於CIN消耗空白。 http://stackoverflow.com/questions/11462021/issue-with-cin-when-spaces-are-inputted-using-string-class – kfsone

+1

@kfsone - 'cin'不消耗空白;流提取器('operator >>'),無論數據來自何種流。 –

+0

@PeteBecker對我而言,不好的措辭。 – kfsone

回答

5

問題不在管道上,問題是cin >> c跳過空白。

如果你cin >> noskipws >> c

或像這樣它的工作:

std::string q; 
getline(cin, q); 

for(i = 0; i < n && i < q.size(); i++) 
{ 
    if (q[i] != s[i]) 
    ... 
} 
+0

謝謝,這是有效的! –

1

使用cin和無關與管道時,這是默認的行爲。

您可能想告訴流不忽略空格:

std::cin >> std::noskipws; 

然後繼續作爲你已經做。

+1

這是使用流提取器('operator >>')時的默認行爲,無論提取器應用於什麼流。除了使用'std :: noskipws',你還可以通過'basic_istream :: get()'來讀取單個字符而不用跳過空格。 'operator >>'是**格式的**流操作; 'get'是未格式化的。 –

相關問題