Вводится строка символов, которые разделены на слова.
Пробелы являются разделителями между словами, причём слова могут
разделяться более чем одним пробелом, в начале и конце строки пробелы также
допускаются. Удалить слова, заканчивающиеся на букву, введенную с
клавиатуры (регистр буквы не учитывается), сохраняя пробелы до и после слова.
Вывести преобразованную таким образом строку.
Вот что вышло у меня(работает неправильно):
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str, temp, result;
char letter;
int j, k, i, temp1, t;
cout << "Введите строку: " << endl;
getline(cin, str);
cout << "Введите букву: " << endl;
cin >> letter;
for (int i = str.size(); i > 0; i--)
{
if (str[i] == letter && str[i + 1] == ' ')
{
j=i;
while(j > 0)
{
j--;
k++;
if(str[j] == ' ' && str[j + 1] != ' ')
{
str.erase(j, k);
break;
}
}
k = 0;
}
}
cout << str << endl;
}
C/C++
Пожалуйста, помогите решить задачу! C++
Чтобы публиковать код с сохранением форматирования, нажмите под полем редактирования кнопку <>, появится блок кода, и в него вставляйте код.
А по правилам языка можно сказать, что там всё печально. Если бы я был доктором, то советовал бы уже измерять рост.
По функционалу, можно сказать только одно: программа делает что-то своё, не относящееся к условию задачи. В условии требуется удалять слова и сохранять пробелы, вы удаляете пробелы и не удаляете слова (рандом по k не в счёт). В условии требуется сравнивать без учёта регистра, вы сравниваете с учётом регистра. Бестолковый цикл в обратную сторону, видимо, призван подстраховать вас от удаления символов прямо из-под итератора. Но в вашем случае этот трюк не работает, т..к переменная i осталась где-то позади, и символы из-под неё давно уехали, а вы продолжаете крутить по ней цикл и что-то там сравнивать за границами укоротившегося массива.
На случай вопроса: "как сделать, чтобы это заработало", скажу, что никак. Говнокод не исправляют, его выбрасывают и пишут нормальную реализацию. Например, такую:
А по правилам языка можно сказать, что там всё печально. Если бы я был доктором, то советовал бы уже измерять рост.
for (int i = str.size(); i > 0; i--)
Бред. Это не Паскаль. Изучите диапазон индексов в массивах C/C++. if (str[i] == letter && str[i + 1] == ' ')
Дважды бред. Такое бы не прокатило даже в Паскале. k++;
В переменной k был какой-то рандом (вы же её не инициализировали), а теперь там рандом + 1. И далее: str.erase(j, k);
Удаляем рандомное количество символов, начиная с позиции пробела. Чудно.По функционалу, можно сказать только одно: программа делает что-то своё, не относящееся к условию задачи. В условии требуется удалять слова и сохранять пробелы, вы удаляете пробелы и не удаляете слова (рандом по k не в счёт). В условии требуется сравнивать без учёта регистра, вы сравниваете с учётом регистра. Бестолковый цикл в обратную сторону, видимо, призван подстраховать вас от удаления символов прямо из-под итератора. Но в вашем случае этот трюк не работает, т..к переменная i осталась где-то позади, и символы из-под неё давно уехали, а вы продолжаете крутить по ней цикл и что-то там сравнивать за границами укоротившегося массива.
На случай вопроса: "как сделать, чтобы это заработало", скажу, что никак. Говнокод не исправляют, его выбрасывают и пишут нормальную реализацию. Например, такую:
#include
#include
#include
using namespace std;
int main() {
cout
Артём Аржанников
Большое спасибо, за такой развернутый ответ, буду знать! А насчет вашей программы, она удаляет слова, НАЧИНАВШИЕСЯ на букву, введенную с клавиатуры, мне же нужно наоборот, но это неважно, главное, что указали на мои ошибки и теперь, есть хоть какой-то образец перед глазами...
Похожие вопросы
- Помогите решить задачу, c++, функции
- Помогите решить задачу C++
- Помогите решить задачу c++
- Помогите решить задачу C++, пожалуйста.
- Помогите решить задачу C++
- Помогите решить задачу C++
- Помогите решить задачу C++
- Помогите решить задачу . C++
- Помогите решить задачу пожалуйста, в C++
- Помогите решить задачу по программированию на C++