#include
#include
#include
using namespace std;
string reverse(const string& s) {
return string(s.crbegin(), s.crend());
}
string task(const string& s) {
istringstream iss(s);
string word;
string line;
size_t n = 0;
while (iss >> word) {
if (n & 1) word = reverse(word);
line += word + ' ';
++n;
}
line.pop_back();
return line;
}
string inpline(const char* msg) {
cout
C/C++
Перевернуть каждое четное слово в строке
#include
#include
#include
using namespace std;
pair str_tok(const char* str, const char* delim)
{
//наша самописная функция которая в отличии от strtok не возвращает отдельные слова
//а возвращает два указателя на начало и на конец слова что позволяет сохранять оригинальную
//структуру текста.
static auto delims = make_unique(256); //статический массив разделителей
if (!str)
{
//нулевая строка включает режим установки разделителей
if (delim)
while (*delim)
{
delims[*delim] = true; //по кординатам равным коду символа устанавливаем 1
delim++;
}
else //если нужно поменять разделители, нужно сбросить прежние.
{
for (auto i = 0u; i < 256; i++) delims[i] == false; //сброс всех значений на 0
}
}
else
{
while (*str && delims[static_cast(*str)]) str++; //пропуск разделителей до слова
if (!*str) return make_pair(nullptr, nullptr); //если слова не найдено, возвращаем нулевые указатели
auto beg = str; //запоминаем начало слова
while (*str && !delims[static_cast(*str)]) str++; //идем к концу слова
return make_pair(beg, str); //вовзращаем указатели на начало и на конец слова
}
return make_pair(nullptr, nullptr); //возвращает пустые значения при установке разделителей
}
int main()
{
string str; //строка
pair word; //координаты конеца и начала слова в строке
unsigned it = 1; //счетчик четности
getline(cin, str); //получаем строку
str_tok(nullptr, " ,!:?.()[];"); //задаем разделители в нашей кастомной функции
word.second = str.c_str(); //задаем конец слова как начало нашей строки
while ((word = str_tok(word.second, "")).first) //ищем координаты слова (от конца предыдущего) пока не вернет пустой указатель
{
it++; //увеличиваем счетчик
if (it & 1) reverse(const_cast(word.first), const_cast(word.second));
//если счетчик нечетный (четное слово) то передаем на функцию reverse (из библиотеки алгоритм) указатели слова
//и да простит нам стринг за вмешательство в его строку. (const_cast отменяет модификатор "только для чтения")
}
cout
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <sstream>
//Функция разворачивает символы между указателями begin и end
void reverse(char *begin, char *end)
{
//Двигаемся с краев (от begin и от end) к центру, меняя местами крайние символы
while (begin < end)
{
char c = *begin;
*begin = *end;
*end = c;
++begin; --end;
}
}
//Функция возвращает true, если символ c является пробельным симолом
bool is_space(char c)
{
return c == ' ' || c == '\t';
}
void main()
{
char str[1024]; //в этот массиве символов будет размещена строка
//Получение строки:
printf("Input string:\n");
gets(str);
//Перевертывание четных слов.
//Слово - любая непрерывная последовательность непробельных символов.
//То есть таких символов, для которых is_space вернет false.
//Слово может состоять из одного символа.
char *pos = str; //текущий символ
char *begin = NULL, *end = NULL; //указатель на первый и на последний символы слова
int words_count = 0; //количество слов (нужно для опрделения четности слова)
//Последовательный перебор символов строки
while (*pos)
{
//Если начало слова еще не обнаружено и текущий символ не является пробельным, то
//это начало слова. Запоминаем его.
if (!begin && !is_space(*pos))
{
begin = pos;
}
char next = *(pos + 1); //определение символа следующего за текущим
//Если этот символ пробельный или конец строки, то это конец слова.
//Запоминаем этот символ.
if (begin && (is_space(next) || 0 == next))
{
end = pos;
}
//Если у нас есть и начало, и конец слова, то:
if (begin && end)
{
//Увеличим количество слов и проверим четное ли слово
if (++words_count % 2 == 0)
{
//Если слово четное - развернем его
reverse(begin, end);
}
//Сбросим указатели на начало и конец слова
begin = end = NULL;
}
++pos; //сдвиг текущего символа
}
//Вывод результата:
printf("Result:\n%s\nPress any key to end...", str);
_getch();
}
#include <stdio.h>
#include <iostream>
#include <sstream>
//Функция разворачивает символы между указателями begin и end
void reverse(char *begin, char *end)
{
//Двигаемся с краев (от begin и от end) к центру, меняя местами крайние символы
while (begin < end)
{
char c = *begin;
*begin = *end;
*end = c;
++begin; --end;
}
}
//Функция возвращает true, если символ c является пробельным симолом
bool is_space(char c)
{
return c == ' ' || c == '\t';
}
void main()
{
char str[1024]; //в этот массиве символов будет размещена строка
//Получение строки:
printf("Input string:\n");
gets(str);
//Перевертывание четных слов.
//Слово - любая непрерывная последовательность непробельных символов.
//То есть таких символов, для которых is_space вернет false.
//Слово может состоять из одного символа.
char *pos = str; //текущий символ
char *begin = NULL, *end = NULL; //указатель на первый и на последний символы слова
int words_count = 0; //количество слов (нужно для опрделения четности слова)
//Последовательный перебор символов строки
while (*pos)
{
//Если начало слова еще не обнаружено и текущий символ не является пробельным, то
//это начало слова. Запоминаем его.
if (!begin && !is_space(*pos))
{
begin = pos;
}
char next = *(pos + 1); //определение символа следующего за текущим
//Если этот символ пробельный или конец строки, то это конец слова.
//Запоминаем этот символ.
if (begin && (is_space(next) || 0 == next))
{
end = pos;
}
//Если у нас есть и начало, и конец слова, то:
if (begin && end)
{
//Увеличим количество слов и проверим четное ли слово
if (++words_count % 2 == 0)
{
//Если слово четное - развернем его
reverse(begin, end);
}
//Сбросим указатели на начало и конец слова
begin = end = NULL;
}
++pos; //сдвиг текущего символа
}
//Вывод результата:
printf("Result:\n%s\nPress any key to end...", str);
_getch();
}
Нужно обращаться к типам данным, делать проверку на четность. Если слово четное то использовать процедуру переворота слова в строке и вывода строки с перевернутым словом.
Похожие вопросы
- Как найти самое длинное слово в строке C++ ?
- Leetcode: переворот порядка слов в строке
- С++ создать массив из элементов каждый из которых равен среднеарефметическому четных элементов каждого столбца
- Работа с матрицами. Нужно найти сумму элементов каждой строки. Помогите пожалуйста ????????
- С++. Упорядочить строки массива A в порядке убывания сумм цифр первого элемента каждой строки.
- Нужно сделать метод, в который я могу передать строку, а она должна вернуть мне длину последнего слова в этой строке
- Дана строка, в которой слова разделены или одним пробелом, или запятой и пробелом. C++
- Вывести сумму тех элементов каждой строки, которые расположены правее максимального и левее минимального.
- Работа со строками, поиск слова
- Как реализовать поиск похожей строки в базе данных?