Другие языки программирования и технологии

C++, надо вывести строку только с 1 пробелом вместо нескольких

Например, преобразовать "Привет Новый год" в "Привет Новый год"
Так:

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

using namespace std;

int main() {
    string s;
    cout << "string? ";
    getline(cin, s);
    s.erase(unique(s.begin(), s.end(), [](char x, char y){ return x == ' ' && y == ' '; }), s.end());
    cout << "result: " << s << endl;
    return 0;
}

Или так:

#include <string>
#include <sstream>
#include <iostream>

using namespace std;

int main() {
    string s, w;
    cout << "string? ";
    getline(cin, s);
    istringstream iss(s);
    s.clear();
    while (iss >> w) s += w + ' ';
    cout << "result: " << s << endl;
    return 0;
}

Еще так:

#include <string>
#include <iostream>

using namespace std;

int main() {
    string s;
    cout << "string? ";
    getline(cin, s);
    for (string::iterator i = s.begin(); i < s.end() - 1;) if (*i == ' ' && *(i + 1) == ' ') i = s.erase(i); else ++i;
    cout << "result: " << s << endl;
    return 0;
}

Можно вообще обойтись без модификации исходной строки:

#include <string>
#include <iostream>

using namespace std;

int main() {
    string s;
    cout << "string? ";
    getline(cin, s);
    cout << "result: ";
    string::iterator i = s.begin();
    cout << *i;
    for (++i; i < s.end(); ++i) if (! (*i == ' ' && *(i - 1) == ' ') ) cout << *i;
    cout << endl;
    return 0;
}

Ну и т. д и т. п.
Борис Альберт
Борис Альберт
61 716
Лучший ответ
Если надо только вывести строку, то я бы не стал заводить дополнительные переменные. Алгоритм прост до нельзя. Обходим строку посимвольно, если встретился символ пробела, то выводим его только если предыдущий символ "непробел", иначе тупо выводим символ