Удаление из строки всего, кроме цифр

109
07 июня 2019, 02:50
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string cleaned(string s1)
{
    string cl;
    for (int i=0;i<s1.length();++i)
    {
        if (isdigit(s1[i]))
        {
            cl[i]=s1[i];
        }
    }
    return cl;
}
int main()
{
string s1="213asd123asd2134";
cout<<cleaned(s1)<<endl;
}

Проблема в том, что в консоли ничего не выводится. (Не уверен что сделал правильно)

Answer 1

У вас нет ничего в cl - как вы собираетесь писать в i-й символ? Да даже если бы и было место - то у вас просто были бы разрозненные цифры...

Замените

cl[i]=s1[i];

на

cl +=s1[i];

И, кстати, незачем передавать строку в функцию по значению - достаточно константной ссылки.

P.S. не по делу :) - в связи с вопросами оптимизации в соседнем ответе у меня для VC++2017 лучший результат получился при

string cl;
cl.reserve(s.length());
for(int i = 0, l = s.length(); i < l; ++i)
    if (s[i] <= '9' && s[i] >= '0')
        cl += s[i];

Кому не лень - можно посмотреть тут.

Answer 2

Я полностью согласен с предыдущим ответчиком, вам нужно cl[i] = s1[i] заменить на cl += s1[i]; однако на мой взгляд

if (isdigit(s1[i]))
    {
        cl += s1[i];
    }

работает медленне, чем следующия реализация:

if (s1[i]-'0'>=0 && s1[i]-'0'<=9)
    {
        cl+=s1[i];
    }

Я говорю это, так как вычитать из символа '0' и получать номер этого символа намного удобнее и много где используется (например для определения заглавная буква или нет). Лучше так, чем искать всякие непонятные команды и специальные функции.

READ ALSO
Перегруженный оператор ==

Перегруженный оператор ==

Не получается использовать перегруженный оператор ==

109
WC_LINK центрирование текста по вертикали

WC_LINK центрирование текста по вертикали

Каким образом можно выровнять по вертикали контент окна с классом WC_LINK? Флаг SS_CENTER не помогает

139
Clion+MinGW+SDL2+CMake

Clion+MinGW+SDL2+CMake

Пожалуйста помогите исправить ошибку

96
Вводится знаковое целое длинное число(32 бита) А. Необходимо циклически сдвинуть А вправо на n бит

Вводится знаковое целое длинное число(32 бита) А. Необходимо циклически сдвинуть А вправо на n бит

Нашёл программу выполняющую условие моей задачиНужно организовать ввод самого числа А и ввод числа n

107