[英]How to read an input string in c++, ignoring spaces
我的任務是創建一個程序,將一個測量單位轉換為另一個測量單位。 因此,如果用戶輸入5公斤,則會將其換算為磅。 要求指出必須在一行上全部讀取用戶輸入,並且輸入中任何位置的任何數量的空格都不能消除功能。 我的問題是:如果用戶輸入的輸入在實際雙倍“質量”值之間,然后在度量單位的不同字詞之間(例如“短噸”)之間有一堆空格,那么我該如何消除空格,以便它讀作只是“短音”? 到目前為止,我的代碼是:
double mass; string unit;
cout << "Enter mass: ";
cin >> mass;
cin.ignore();
cin >> unit;
if (unit == "short tonnes" || unit == "sh tn")
{
//convert to long tonnes
}
我的代碼在輸入double mass值之前會忽略空格,直到輸入字符串的第一部分之前都忽略空格。 但是我無法弄清楚如何使程序將“短噸”讀為“短噸”(與單詞之間的空格無關),以便可以進行字符串比較並根據需要轉換質量值。 預先感謝您的幫助,請不要討厭我,我正處於學習C ++的第一周。
我再次道歉。 編輯后,我認為我的最初評論是正確的。 按照其他人的建議,使用getline
獲得該行。 然后將該行放在std::istringstream
。 從閱讀的話stringstream
使用>>
,並與它們串聯+
操作,直到您已經安裝你正在尋找的一個標記。 >>
的默認行為是為您丟棄所有空格。
所以...
std::string line;
while (std::getline(cin, line)) // reads in a line
{
std::istringstream stream(line);
std::string spaceless;
std::string word;
while (stream >> word) // get words on the line without any whitespace
{
spaceless += word; // assemble without spaces
if (spaceless == "shorttonnes")
{
//do something with spaceless
}
else if (spaceless == "Someothertoken")
{
// do something else with spaceless
}
else if ( ... )
{
// rinse, repeat
}
}
}
這是僅串聯的簡單示例: https : //ideone.com/hGLr6f
還有其他一些技術可以代替if
/ else if
鏈。 一個字符串和函數指針的std::map
,但這是另一個問題。
std::copy_if()
是執行所需操作的另一種方法。 值得學習它的工作原理,因為它可以在除此特定問題之外的許多其他地方找到用途。
如果編寫此空間刪除例程,則如果必須在其他情況下再次解決此問題,它將成為可重用的組件。
void StripSpaces(std::string &str)
{
std::vector<char> temp;
temp.resize(str.length());
auto pred = [] (char &c)
{
return c != ' ';
};
auto temp_end = std::copy_if(str.begin(), str.end(), temp.begin(), pred);
str = std::string(temp.begin(), temp_end);
}
這樣就可以從字符串中就地刪除空格。
vector<char>
在那里保存結果值。 首先知道它的結果不能長於輸入,然后將其大小調整為輸入字符串的長度。
pred
是一個lambda,它只接受單個字符作為參數,並且當且僅當字符不是空格時才返回bool
值true。
std::copy_if
做繁重的工作。 它將字符從源字符串復制到temp
,但pred
對該字符返回true。 它返回一個迭代器,該迭代器在復制的最后一個字符之后指向元素。 如果您想將temp
視為保存結果字符串,則可以非常方便地用作temp.end()
的同義詞。
最后一件事是從temp
的數據重建參數string
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.