Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2023, 18:03   #1
eltiel
Новичок
Джуниор
 
Регистрация: 11.12.2023
Сообщений: 1
Вопрос c++ Из-за меню код работает неверно. Ввод строки, 1-е встр. цифровое слово ^3, до меню работало отлично, не могу найти ошибку

Здравствуйте, по заданию : "Сформировать новую строку, в которую включить только 4-символьные слова, с заменой "А" на "О". Hайти первое цифровое слово и возвести его значение в куб".
Сначала я сделал код без меню, все работало исправно, теперь нет.

Допустим, я ввожу "abcd 2 re".
Должно выводить :
Cтрока - obcd
Куб первого встретившегося цифрового слова - 8

До меню работало исправно, после введения кейсов стало выдавать только строку, а вместо куба пустая строка, даже не выводит текст.

НО! Если я введу "2 abcd re", то тогда все выведется верно.

То есть, если цифровое слово на первом месте - считает куб, если нет - то не выводит вовсе.

Как решить эту проблему..

Программа с меню(неправильно работает):
Код:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>

using namespace std;

int main() {
    setlocale(LC_ALL, "Russian"); //русская локализация

    char input[200]; // массив для ввода строки, макс. 200 символов
    char result[200] = ""; //  массив для вывода строки, макс. 200 символов
    char c;
    int choice; //переменная для меню

menu:
    do
    {
        cout << "14. Сформировать новую строку, в которую включить только 4-символьные слова, с заменой А на О. Hайти первое цифровое слово и возвести его значение в куб." << endl;
        cout << "1. Ввод cтроки" << endl;
        cout << "2. Вывод итоговой строки" << endl;
        cout << "3. Вывод куба первого цифрового слова" << endl;
        cout << "4. Выход" << endl;
        cout << "Ваш выбор:" << endl;
        cin >> choice;
        cout << endl;
    } while (choice < 1 || choice > 4);
    switch (choice)
    {
    case 1:
    {
        c = getchar();
        cout << "Введите текст: ";
        cin.getline(input, 200); // ввод пользователем строки
        char* word = strtok(input, ", "); // делим введенную строку на слова с разделителями ", "
        while (word != NULL) { //пока слово присутствует и не равно 0
            if (strlen(word) == 4) { // если длина слова 4
                for (int i = 0; i < 4; i++) { //перебираем буквы 4-х значного слова
                    if (word[i] == 'a') { // если i-тый элемент содержит "а"
                        word[i] = 'o'; // заменяем в i-том элементе 'а' на 'о'
                    }
                }
                strcat(result, word); // присоединяем слово к результату
                strcat(result, " "); // добавляем пробел после слова
            }
            word = strtok(NULL, ", "); // получаем следующее слово из введенного текста, передаем пустое значение после разделителя(пробела или ,)
        }
        cout << endl;
        goto menu;
    }
    case 2:
    {
        cout << "Результирующая строка: " << result << endl; // вывод итоговой строки
        cout << endl;
        goto menu;
    }
    case 3:
    {
        char* digital = strtok(input, " "); // разделяем строку на слова с пробелами
        while (digital != NULL) { //пока цифровое слово присутствует и не равно 0
            if (strspn(digital, "0123456789") == strlen(digital)) { // если кол-во цифр в числе=длине слова
                int num = atoi(digital); //преобразование цифрового слова в число
                int cub = num * num * num; //возводим в куб число
                cout << "Результат возведения первого числового слова в куб: " << cub << endl; // вывод куба
                break; // останавливаем цикл, так как куб найден
            }
            digital = strtok(NULL, " "); // получаем следующее слово из введенного текста
        }
        cout << endl;
        goto menu;
    }
    case 4:
    {
        exit;
    }
    return 0;
    }
}
Программа без меню(исправно работает):
Код:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>

using namespace std;

int main() {
    setlocale(LC_ALL, "Russian");

    char input[200]; // Объявление массива для ввода текста
    char result[200] = ""; // Объявление массива для результирующей строки


    cout << "Введите текст: "; // Приглашение пользователя ввести текст
    cin.getline(input, 200); // Получение введенного текста от пользователя

    char* word = strtok(input, ", "); // Разделение текста на слова с разделителями ", "
    while (word != NULL) {
        if (strlen(word) == 4) { // Проверка, является ли слово четырёхсимвольным
            for (int i = 0; i < 4; i++) {
                if (word[i]== 'a') { // Проверка, содержит ли слово символ 'а'
                    word[i] = 'o'; // Замена символа 'а' на 'о'
                }
            }
            strcat(result, word); // Добавление измененного слова в результирующую строку
            strcat(result, " "); // Добавление пробела после слова
        }
        word = strtok(NULL, ", "); // Получение следующего слова из введенного текста
    }

    cout << "Результирующая строка: " << result << endl; // Вывод результирующей строки

    char* digital = strtok(input, " "); // Разделение текста на слова с пробелами
    while (digital != NULL) {
        if (strspn(digital, "0123456789") == strlen(digital)) { // Проверка, является ли слово числовым
            int num = atoi(digital); // Преобразование числового слова в числовое значение
            int cub = num * num * num; // Возведение числа в куб
            cout << "Результат возведения первого числового слова в куб: " << cub << endl; // Вывод результата возведения в куб
            break;
        }
        digital = strtok(NULL, " "); // Получение следующего слова из введенного текста
    }

    return 0;
}
eltiel вне форума Ответить с цитированием
Старый 12.12.2023, 00:43   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

По-моему и вариант без меню не работает.
Если я правильно помню, то strtok модифицирует входную строку, а не выделяет новую память под токены.
Следовательно и всякие word[i] = 'o' так же изменят input
Пошагово выполнять программу и смотреть что там в переменных записано, т.е. учиться отлаживать. Точки останова (breakpoint) и т.д. и т.п.
pu4koff вне форума Ответить с цитированием
Старый 22.01.2024, 10:05   #3
gregbowers
Новичок
Джуниор
 
Регистрация: 22.01.2024
Сообщений: 3
По умолчанию

In your menu-based C++ program, the issue arises from the input not being reprocessed within each menu option, leading to incorrect parsing and empty output. To resolve this, ensure that you reprocess the input string within each case of the switch statement. This modification will correctly handle the input for options like input processing, output, and cube calculation, providing accurate results.

Thank you

Последний раз редактировалось BDA; 22.01.2024 в 14:31. Причина: удаление ссылки
gregbowers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Меню работает не корректно. При выборе пункта меню Пропадает фон, смещается название пункта меню. NikMaster WordPress и другие CMS 1 12.07.2017 21:57
не могу найти ошибку в программе на C++: не работает функция вывода alinka--- Помощь студентам 7 17.12.2015 15:09
Не могу найти скрытое меню aleshaumen Помощь студентам 0 26.06.2015 18:18
преобразовать строку,заменяя каждое слово 'this' словом 'the' . Не могу найти ошибку. Заранее спасибо СанекКенас Паскаль, Turbo Pascal, PascalABC.NET 1 22.01.2015 07:00