@Annie96

Действия над строками, что добавить?

Дана строка с некоторым текстом. Составить программу, которая меняет в этом тексте все строчные буквы на прописные, прописные на строчные и исключает все символы, не являющиеся буквами, кроме пробелов.
Не получается почистить от ненужных значений и так, чтобы не удалить пробелы, с регистрами разобралась, ребята, выручайте
#include "stdafx.h"
#include <string>
#include <iostream>
#include <ctype.h>
    using namespace std;
 
    int main()
    {
        string line;
        cout << "Enter text: " << endl;
        getline(cin, line);
        int size = line.length();
        for (int i = 0; i < size; ++i)
        {
            do{
                    line.erase(i, 1); // удаляет из строки символ с индексом i
            } while (isalpha(line[i]) != 0);
            if (islower(line[i]))//нижний регистр?
            {
                line[i] = toupper(line[i]);//если да, то подними
            }
            else
            {
                line[i] = tolower(line[i]);//иначе ты в верхнем - в нижний регистр
            }
        }
        cout <<line<< endl;
        system("pause");
        return 0;
    }
  • Вопрос задан
  • 2385 просмотров
Пригласить эксперта
Ответы на вопрос 3
@mamkaololosha
cpp.com.ru/shildt_spr_po_c/14/14.html все нужные вам функции тут.
Ответ написан
donkaban
@donkaban
Умею рисовать тени
www.cplusplus.com/reference/cctype/isblank

while (!isalpha(line[i]) || !isblank(line[i])) ...

ну или, если компилер не c++11 (а есть такие?) -

while (!isalpha(line[i]) || !line[i] == ' ') ...
Ответ написан
Комментировать
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
do
{
    line.erase(i, 1); // удаляет из строки символ с индексом i
}  while (isalpha(line[i]) != 0);


Вот этот кусок очень нехороший.
Во первых в отличие от while(...){}, do{}while (...) делает проверку после того как исполнит свое содержимое. Поэтому, например, первому символу в стоке в любом случае не жить, не важно буква это или нет. Вам нужен обычный while.
Далее, каждый раз когда вы вызываете line.erase(i, 1); Это неизбежно удаляет символ из строки и уменьшает ее длину. Но вы запомнили длину строчки, когда только прочитали ее в переменной size. Поэтому цикл for будет бежать по тем элементам которых давно уже нет. Избавьтесь от переменной size, сравнивайте i напрямую с line.length().
Вместо isalpha(line[i]) != 0 лучше писать просто !isalpha(line[i]).
Едем дальше. Если вы хотите сохранить пробелы, то вам надо удалять текущий символ если он не буква и не пробел. Условие дословно переводим на C++: (!isalpha(line[i]) && line[i] != ' ')
И еще не совсем ошибка, но если символ не в верхнем регистре, то не обязательно он в нижнем. Например это может быть пробел. К счастью tolower и tщupper ничего не делают с небуквенными символами.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы