Проблема с нахождением первого цифрового слова С++

147
19 июня 2022, 20:50

Программа должна удалять каждое четное слово, дублировать каждое нечетное слово, заменять все вхождения букв 'д ' на 'т' и найти первое цифровое слово и умножить его значение на 5.

Вот программа

#include <iostream>
#include <string>
#include <sstream>
#include <Windows.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i, k;
int number = 0;
std::string s;
std::getline(std::cin, s);
std::istringstream iss(s);
std::string sr;
i = 0;
do
{
    std::string sub;
    iss >> sub;
    if (i % 2 == 0)
    {
        sr.append(sub);
        sr.append(sub);
        sr.append(" ");
    }
    else
        sr.append(" ");
    i++;
} while (iss);
for (i = 0; i < sr.length(); i++)
    if (sr[i] == 'д')
    {
        sr.erase(i, 1);
        sr.insert(i, "т");
    }
for (i = 0; i < s.length(); i++)
    if ((s.substr(i, s.find(" ")) >= "0") && (s.substr(i, s.find(" ")) <= "9"))
        if (s.substr(i + 1, 1) == " ")
            if (i > 0)
            {
                if (s.substr(i - 1, 1) == " ")
                {
                    k = atoi(s.substr(i, s.find(" ")).c_str());
                    std::cout << k << std::endl; //Для того, чтобы знать, что происходит 
                    break;
                }
            }
            else
            {
                k = atoi(s.substr(i, s.find(" ")).c_str());
                std::cout << k << std::endl; //Это тоже
                break;
            }
std::cout << sr << std::endl;
std::cout << s << std::endl;
std::cout << k * 5 << std::endl;
return 0;
}

У меня почему-то не работает "Найти первое цифровое слово и умножить его значение на 5." т.е проблема в этом цикле

for (i = 0; i < s.length(); i++)
    if ((s.substr(i, s.find(" ")) >= "0") && (s.substr(i, s.find(" ")) <= "9"))
        if (s.substr(i + 1, 1) == " ")
            if (i > 0)
            {
                if (s.substr(i - 1, 1) == " ")
                {
                    k = atoi(s.substr(i, s.find(" ")).c_str());
                    std::cout << k << std::endl;
                    break;
                }
            }
            else
            {
                k = atoi(s.substr(i, s.find(" ")).c_str());
                std::cout << k << std::endl;
                break;
            }

Если в тексте будет число больше 9, то в последнем выводе "к" будет непонятное число, а если меньше 0, то цикл пропускает это число и идёт дальше. Мне кажется, что проблема в условии, но я не понимаю как её решить. Получается нужно, чтобы программа находила слово из строки "s", состоящее только из цифр, и умножил его на 5.

98 59 5 ввод

9898 55 вывод sr

98 59 5 вывод s

28830755 вывод k

-5 6 8 ввод

6 вывод k из цикла

-5-5 88 вывод sr

-5 6 8 вывод s

30 вывод k

Answer 1

Проверить цифровое ли слово, и если да, то умножить значение на 5(все можно делать так, как вы это сделали бы на бумаге:

bool find_number_and_multiply_5(string& str)
{
    const std::string numbers("0123456789");
    if (str.find_first_not_of(numbers) != str.npos)
        return false;    
    int digit{}, surplus{};
    for (int i = str.length() - 1; i >= 0; --i) {
        digit = str[i] - '0';
        digit *= 5;
        digit += surplus;            
        surplus = digit / 10;            
        str[i] = digit % 10  + '0';
    }
    if (surplus)
        str.insert(str.begin(), surplus + '0');
    return true;
}

Но я думаю, что остальная часть программы у вас тоже не очень получается. Думайте проще....

READ ALSO
Освобождение загруженного ресурса

Освобождение загруженного ресурса

Есть консольная программа с бинарными ресурсами (Windows)Нашел, как загружать, записывать в файл и так далее -

157
Обозначение указателей в C++

Обозначение указателей в C++

ЗдравствуйтеЕсть ли какие-нибудь существенные различия между такими определениями указателя:

218
Boost Asio Streambuf, UDP, Передача структур данных по сети

Boost Asio Streambuf, UDP, Передача структур данных по сети

Всем привет! Когда клиент отправляет серверу(или наоборот) буфер данных сделанное с помощью boost::asio::streambuf то данные как то смещаются и на выходе...

263