Программирование на языке с++ - Вопросы по С+

Вопрос Программирование на языке с++

Регистрация
21 Авг 2013
Сообщения
71
Репутация
0
Спасибо
0
Монет
0
Пробелы по правилам



В строке имеется несколько слов, разделённых одним или несколькими пробелами. Требуется убрать из текста лишние пробелы: два и более пробела подряд, а также все пробелы в начале и в конце строки.



Входные данные



На вход программе подаётся строка, состоящая не более чем из 255 символов.



Выходные данные



Выведите преобразованную строку.



Примеры

Ввод Odin Dva Tri Вывод

Вывод Odin Dva Tri

ПОМОГИТЕ, ПОЖАЛУЙСТА, ИСПРАВИТЬ МОЙ КОД:

#include <iostream>

#include <string>

using namespace std;

int main()

{



string s = "";

getline(cin, s);

for (int i = 0; i <= s.size(); i++)

{



if (s != ' ') {

s=s+' ';

}



}



cout << s<< endl;



}
 
Регистрация
13 Апр 2013
Сообщения
70
Репутация
0
Спасибо
0
Монет
0
Ваш код почти верный, но есть небольшие ошибки. Вот исправленный код:

```cpp
#include <iostream>
#include <string>
using namespace std;

int main()
{
string s = "";
getline(cin, s);

string result = "";
bool isSpace = false;
for (int i = 0; i < s.size(); i++)
{
if (s != ' ')
{
isSpace = false;
result += s;
}
else if (!isSpace)
{
isSpace = true;
result += ' ';
}
}

// Удаление пробелов в начале и в конце строки
while (result.size() > 0 && result[0] == ' ')
{
result = result.substr(1);
}
while (result.size() > 0 && result[result.size() - 1] == ' ')
{
result = result.substr(0, result.size() - 1);
}

cout << result << endl;

return 0;
}
```

Теперь код работает правильно: убирает лишние пробелы и пробелы в начале и в конце строки.
 
Регистрация
29 Ноя 2012
Сообщения
82
Репутация
0
Спасибо
0
Монет
0
Пожалуйста имейте ввиду, что этот пользователь забанен
#include <iostream>
#include <string>
using namespace std;

int main() {
string s;
getline(cin, s); // Читаем всю строку

string result; // Сюда будем записывать результат без лишних пробелов
bool spaceFound = false; // Флаг, что предыдущий символ был пробелом

// Удаляем пробелы в начале строки (пропускаем их)
size_t start = s.find_first_not_of(' ');
if (start == string::npos) { // Если строка состоит только из пробелов
cout << "" << endl;
return 0;
}

// Удаляем пробелы в конце строки
size_t end = s.find_last_not_of(' ');
s = s.substr(start, end - start + 1); // Обрезаем пробелы по краям

// Проходим по строке и убираем лишние пробелы внутри
for (char c : s) {
if (c == ' ') {
if (!spaceFound) { // Если предыдущий символ не был пробелом
result += ' ';
spaceFound = true;
}
} else {
result += c;
spaceFound = false;
}
}

cout << result << endl;
return 0;
}
 
Регистрация
30 Сен 2013
Сообщения
94
Репутация
0
Спасибо
0
Монет
0
у тебя логика в цикле кривая переписывай строку неправильно попробуй через промежуточную строку и trim
 
Регистрация
12 Ноя 2012
Сообщения
91
Репутация
1
Спасибо
1
Монет
0
На этом основан парсинг - синтаксический разбор текста.
Просматривайте текст в цикле while() до тех пор, пока не встретится символ переноса строки \n или нуль-терминированный символ \0 и в условии if(' ') ищите ANSI-символ пробела, его код - 0x20 или в символьном представлении ' '.
Создаете новую строку, скопировав в нее исходную, до символа пробела, затем повторяете после пробела, но сам пробел не копируете в новую строку
 
Сверху Снизу