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