Условие задачи : Удалить из строки все пробелы, строку должен вводить пользователь
Сложность : легкая .
С этой задачей мне пришлось попотеть, хоть и решается она легко, но я долго это не мог сделать.
До начала работы вам нужно прочитать вот (эту) статью. Там рассказывается про строки.
В самой задаче нам понадобиться функция getline, она у нас будет использоваться вместо обычного ввода cin >>
Как я понял она тоже используется для ввода строки, но заполняет массив входного потока как то так.
Проще говоря cin считывает данные до первого пробела, getline по умолчанию считывает до перевода строки.
Т.е. как вы поняли если у нас будет cin , то программа работать не будет.
И так начнем писать программу.
Для начала стадартные действия подключим библиотеки
#include <iostream> // подключаем библиотеку ввода и вывода #include <string> // библиотека для работы со строками using namespace std ; // используем именное пространство std
Теперь начнем писать функцию main() :
int main() { setlocale(LC_ALL, "Russian"); // включаем русский язык string str; // создаем строку cout << "Введите строку" << endl; getline(cin, str); // вводим строку }
Теперь у нас есть строка, и нам нужно в ней удалить все пробелы, для этого мы используем цикл for.
Мы пробежимся по каждому элементу строки рыская пробел и если его найдем то удалим :
for(int i = 0; i < str.length(); i++) { if(str[i] == ' ') str.erase(i,1); }
Номер элементов в строке начинается с 0, поэтому i мы присваиваем 0. Цикл у нас будет кончаться тогда когда закончатся все элементы строки. Еще раз скажу прочитайте вот (эту) статью.
Функция erase — удалит нам пробел, но бывают такие случаи когда подряд идут два пробела, тогда выше указанный код нам не поможет, что делать в таких случаях, нужно написать следующее:
for(int i = 0; i < str.length(); i++) { if(str[i] == ' ') { str.erase(i,1); i--; }
Почему так? Представьте что есть две буквы и между ними два пробела, допустим это строка: f b. В ней 4 символа: f b и два пробела:
str[0] = 'f'; str[1] = ' '; // пробел str[2] = ' '; // пробел str[3] = 'b';
Вот мы пускаем цикл, первый проход все хорошо, второй проход у нас пробел, мы его удаляем и у нас в строке уже три символа, т.е. на место str[1] встаёт str[2], а у нас там опять пробел и вот чтобы удалить это пробел и пишется i—;, т.е. мы как бы назад вернулись чтобы проверить нет ли еще пробела там.
Если я не ошибаюсь то у этого кода есть минус он выполняет лишние операции, но они не существенны.
Да и еще, если вы введёте русскую строку то программа выведет не понятные символы так что программа работает только с англ.символами.
Весь код программы :
#include <iostream> // подключаем библиотеку ввода и вывода #include <string> // библиотека для работы со строками using namespace std ; // используем именное пространство std int main() { setlocale(LC_ALL, "Russian"); // включаем русский язык string str; cout << "Введите строку" << endl; getline(cin, str); for(int i = 0; i < str.length(); i++) { if(str[i] == ' ') { str.erase(i,1); i--; } cout << str << endl; system("PAUSE"); // чтобы программа не закрывалась return 0 ; // возвращаем функции main() ноль }