Top.Mail.Ru
Ответы

Сложная задача со строкой C++

Ранее я выкладывал похожий вопрос только со списком, но нужно сделать немного иначе помогите пожалуйста решить её или хотябы дать совет как решить. Задача звучит следующим образом и должна выполняться на языке C++: есть некая строка например char str[] и в ней хранятся слова например "ABCD 12345 hrom" нужно чтобы после выполнения кода в консоль выводилось сообщение "DCBA 54321 mroh", то есть нужно перевернуть буквы, но слова оставить на месте. ГЛАВНЫЕ УСЛОВИЯ: Можно использовать только 1 цикл за всё выполнения кода, то есть должен быть только 1 проход по массиву списка, можно только 1 раз написать в коде while, или for, больше одного раза нельзя, внутренних циклов тоже быть не должно, то есть если есть цикл while, то внутри него не должно быть других циклов. Также нельзя использовать любые виды рекурсии, а ещё нельзя использовать goto, и буфер обмена, так же нельзя использовать функцию reverse и библиотеку <vector>, в строку значение нужно вводить через код, а не через консоль, бесконечный цикл например такой как while(true) также использовать нельзя, в данную строку можно вводить любое количество значений для переворота (без ограничения). Если поможете буду очень признателен

Дополнен

Забыл упомянуть Флаги(любые) также использовать нельзя

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Новичок
1мес

Берём код из предыдущего моего ответа (который и был сделан для строки), меняем string на *char и получаем:

1234567891011121314151617181920212223242526272829303132
 #include <iostream>

using namespace std;

void put_reverse(const char *s) {
    const char *start = s, *end = s, *cur = s;
    bool is_reverse = false;

    while (is_reverse || *cur) {
        if (is_reverse) {
            if (cur > start) {
                cout << *--cur;
            } else {
                if (*end) {
                    cout << *end;
                    start = cur = end + 1;
                } else {
                    cur = end;
                }
                is_reverse = false;
            }
        } else if (*cur == ' ' || *++cur == '\0') {
            end = cur;
            is_reverse = true;
        }
    }
}

int main() {
    char str[] = "ABCD 12345 hrom";
    put_reverse(str);
} 

Цикл - единственный.
Рекурсия - нет.
Goto - нет.
Буфер - нет.
Reverse - нет.
<Vector> - нет.
Консольный ввод - нет.
Бесконечный цикл - нет.
Длина строки и кол-во слов в строке - неограниченны.

Аватар пользователя
Высший разум
1мес
123456789101112131415161718192021222324252627
 // C++20
#define _CRT_SECURE_NO_WARNINGS 
#include <cstring> 
#include <iostream> 
#include <string> 
using namespace std; 
int main() { 
    char str[] = "ABCD 12345 hrom"; 
    const auto n = size(str); 
    size_t i = 0; 
    size_t j = 0; 
    while (j < n) { 
        if (isspace((unsigned char)str[j])) { 
            ++i; 
            ++j; 
            continue; 
        } 
        ++j; 
        if (isspace((unsigned char)str[j]) || !str[j]) { 
            auto tmp = string{ str + i, str + j }; 
            auto rev = string{ crbegin(tmp), crend(tmp) }; 
            strncpy(str + i, to_address(begin(rev)), rev.length()); 
            i = ++j; 
        } 
    } 
    cout << str << '\n'; 
} 
123456789101112131415161718192021222324252627
 // C++11
#define _CRT_SECURE_NO_WARNINGS 
#include <cstring> 
#include <iostream> 
#include <string> 
using namespace std; 
int main() { 
    char str[] = "ABCD 12345 hrom"; 
    const auto n = strlen(str); 
    size_t i = 0; 
    size_t j = 0; 
    while (j < n) { 
        if (isspace((unsigned char)str[j])) { 
            ++i; 
            ++j; 
            continue; 
        } 
        ++j; 
        if (isspace((unsigned char)str[j]) || !str[j]) { 
            auto tmp = string(str + i, str + j); 
            auto rev = string(tmp.crbegin(), tmp.crend()); 
            strncpy(str + i, &*rev.begin(), rev.length()); 
            i = ++j; 
        } 
    } 
    cout << str << '\n'; 
} 
Аватар пользователя
Ученик
1мес

тьиоолы

Аватар пользователя
Ученик
1мес

На плюсах не помню, отлаживать лень. Суть решения в том, что надо в цикле текущий символ переставлять с симметричным символом от конца строки. А потом, когда встречаешь пробел, выводить подстроку, которая получилась в конце (как раз перевёрнутая). Потом то же со следующим словом, подстроку соответствующую ему.

Аватар пользователя
Гений
1мес

Включить консоль в режим вставки.
Считываешь строку с конца - печатаешь слово. Если пробел - переводишь каретку в начало.