2010-06-01 53 views
6

使用std::string類型來接受一個句子,練習(我沒有用過C++中的字符串)我正在檢查一個字符是不是元音。我得到這個:C++:爲什麼空格在讀取時總是終止一個字符串?

for(i = 0; i <= analyse.length(); i++) { 
if(analyse[i] == 'a' || analyse[i] == 'e' [..etc..]) { 
...vowels++;  
} else { ... 
...consonants++; 
} 

這工作正常,如果字符串是一個詞,但第二次我添加一個空格(IE:aeio aatest),它將只算第一模塊和計數的空間作爲輔音,並退出閱讀句子(退出for循環或什麼的)。

是否將空格計爲無字符== null?或者與std::string有一些奇怪之處?,這將有助於知道爲什麼發生這種情況!

編輯: 我只是通過給std :: cin接受字符串,如:

std::string analyse = ""; 
std::cin >> analyse; 
+0

它不是std :: string,它可以容納任何字符,包括空格和空值。顯示你如何閱讀字符串。 – 2010-06-01 04:01:45

+0

你如何設置「analyse」?如果你'cout << analyse.length()',你會得到什麼?字符串「aecio」是否正確計數?也許問題出在else塊的'...'部分? – 2010-06-01 04:03:39

+1

在一邊..將長度存儲在變量(const int ci = analyse.length();)for中的函數是不好的做法。 – baash05 2010-06-01 06:09:27

回答

9

我猜你正在讀之類的字符串。運算符>>用於字符串的定義與scanf%s轉換的工作(大約)相同,該轉換會讀取直到遇到空白爲止 - 因此,operator>>也是如此。

您可以使用std::getline來讀取整行輸入。您可能還想查看發佈到上一個問題的answer(提供了std::getline的一些替代方法)。

+0

感謝您的答覆鏈接,+1 – Nullw0rm 2010-06-01 04:09:47

4

我不能從您粘貼代碼告訴我們,但我要去並且猜測你正在使用流提取操作符(流>>字符串)讀入字符串。

流提取操作符在遇到空白時停止。

如果這不是發生了什麼,你能告訴我們你是如何填充你的字符串,它的內容是什麼?

如果我是對的,那麼你會想要一個不同的方法來讀取字符串中的內容。 std :: getline()可能是從文件中讀取的最簡單的方法。它停在換行符而不是空白處。基於編輯的問題


編輯:(。雙檢語法我不是在我的編譯器的前面) 使用這樣的:

std::getline(std::cin, analyze); 

這應該當您按下停止閱讀「進入」。

2

如果你想閱讀整行(包括空白),那麼你應該閱讀使用getline。它用圖解的是這樣的:

#include <string> 
istream& std::getline(istream& is, string& s); 

要讀取整條生產線,你做這樣的事情:

string s; 
getline(cin, s); 
cout << "You entered " << s << endl; 

PS:這個詞是 「聲母」,而不是 「consenent」。

+0

getline正常工作。很高興這不是一些隨機問題,幫助我學習。 – Nullw0rm 2010-06-01 04:06:38

1

istream上的>>運算符將空格上的字符串分隔開來。如果你想得到一整行,你可以使用readline(cin,destination_string)

+0

也許你打算'getline'而不是'readline'?雖然有些庫包含名爲'readline'的函數,但它不是標準庫的一部分。 – 2010-06-01 04:10:37

+0

是的,我確實打算使用getline。 (這是使用readline的其他**語言,這就是爲什麼我感到困惑。) – 2010-06-01 04:24:06