簡體   English   中英

如何在C ++中讀取輸入字符串,忽略空格

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM