Код должен возвращать строку без пробелов, но он возвращает строку до первого символа пробела - PullRequest
3 голосов
/ 16 июля 2011

Я делаю консольный калькулятор и хочу удалить все пробелы, которые пользователь может ввести при использовании программы. Это код:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    string str;
    std::cout<<"Enter sum): ";
    cin>>str;
     str.erase(std::remove_if(str.begin(), str.end(), (int(*)(int))isspace), str.end());
    cout<<str;
    system("pause");
    return 0;
}

если я ввел 2 + 2 =, вывод должен быть 2 + 2 = но вывод: 2 я использую здесь не ту функцию?

Ответы [ 3 ]

4 голосов
/ 16 июля 2011

Проблема заключается в получении пользовательского ввода, а не в удалении пробелов.

Код, удаляющий пробелы, является правильным, как вы можете убедиться в IDEone .

Проблема в том, что оператор std::istream::operator >> прекращает чтение ввода при обнаружении первого символа пробела.Вместо этого вы должны использовать другую функцию (например, getLine).

1 голос
/ 16 июля 2011

Вы можете использовать remove_if и erase. Ваш метод получения входных данных - нет. operator>> - пробел с разделителями. Вместо этого используйте getline.

int main()
{
    string str;
    std::cout<<"Enter sum): ";
    getline(cin,str);
    str.erase(std::remove_if(str.begin(), str.end(), (int(*)(int))isspace), str.end());
    cout<<str;    
    return 0;
}
0 голосов
/ 16 июля 2011

Я использую следующую функцию, которую я написал:

std::string& ReplaceAll(std::string& sS, const std::string& sWhat, const std::string& sReplacement) 
{
    size_t pos = 0, fpos;
    while ((fpos = sS.find(sWhat, pos)) != std::string::npos) 
    {
        sS.replace(fpos, sWhat.size(), sReplacement);
        pos = fpos + sReplacement.size();
    }
    return sS;
}

Вы можете адаптировать его к вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...