Другие языки программирования и технологии
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;
}
Ну и т. д и т. п.
#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;
}
Ну и т. д и т. п.
Если надо только вывести строку, то я бы не стал заводить дополнительные переменные. Алгоритм прост до нельзя. Обходим строку посимвольно, если встретился символ пробела, то выводим его только если предыдущий символ "непробел", иначе тупо выводим символ
Похожие вопросы
- как считывать строку типа char до пробела C++
- как отформатировать жёский диск "C" через командную строку?
- Как на c++ реализовать прием строки произвольного размера из консоли?
- Pascal. Дана строка, элементы - числа через пробел. Как отсечь числа, которые содержат '0'?
- C# Как перевернуть строку?
- Вывести все числа от 1 до N, являющиеся палидромами
- Почему программисты бесятся когда люди ставят пробелы вместо табуляции?
- Скажите пожалуйста как в C++ копировать часть строки?
- Помогите решить задачу C++. Найти номер строки, для которой среднее арифметическое значение ее элементов максимальна
- [C++] Как поменять строки местами в двумерном статистическом массиве размерами N1xN2?