Как вывести каждое слово в массиве символов в обратном направлении

Мне нужно создать функцию, которая меняет местами слова, записанные в массиве символов.

char reverse(char m[50]) {
    for (int i = 0; i <= m['\0']; i++) {
        for (int j = m['\0']-1; j >= m[0]; j--) {
            m[i] = m[j];
        }
    }
}

Я имею в виду код, который выводит что-то вроде этого:

Вход: I am new
. Выход: wen ma I

Что мне нужно:

Вход: I am new
. Выход: I ma wen

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

Возможный дубликат stackoverflow.com/questions/30834885/…

JamesS 18.12.2018 16:56

задача почти тривиальна, если вы храните слова как std::strings, возможно, в std::vector<std::string>

463035818_is_not_a_number 18.12.2018 16:56

Возможный дубликат как распечатать массив в обратном направлении

Blaze 18.12.2018 16:57

@Blaze это не дубликат, если я правильно прочитал другой вопрос. Здесь OP не хочет, чтобы весь массив был перевернут, а перевернуты только слова в строке (но порядок слов не изменился)

463035818_is_not_a_number 18.12.2018 16:58

Совет: не создавайте аргументы, подобные char m[50], вместо этого используйте char* или, поскольку это код C++, const std::string&.

tadman 18.12.2018 16:59

@Eddie duplicate of [Превращает все символы символов в обратную сторону, используя getline, array в C++] (stackoverflow.com/questions/53816331/…)

bruno 18.12.2018 17:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
958
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Если вам нужно решение на C++, то должно работать следующее:

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    std::string str = "I am new";
    auto begin = str.begin();
    while (begin != str.end())
    {
        auto end = std::find(begin, str.end(), ' ');
        std::reverse(begin, end);
        if (end == str.end())
        {
            break;
        }
        begin = end + 1;
    }
    std::cout << str << "\n";
}

Это то, что я ищу, хотя было бы здорово, если бы это было немного проще, ха-ха, я постараюсь понять, как это полностью работает, и реализовать это в моем коде, спасибо!

Eddie 18.12.2018 17:14

@Eddie это простой способ, работа с массивами символов сложна: P

463035818_is_not_a_number 18.12.2018 17:14

Если под упрощением вы имеете в виду использование массивов char, то вы можете в основном использовать тот же код, просто замените std::string::find на strchr. std::reverse будет работать как с указателями, так и с итераторами.

Alan Birtles 18.12.2018 17:24

В этом случае std :: find делает вещи немного более компактными

Alan Birtles 18.12.2018 17:29

Поскольку слова могут быть разделены не только пробелом, следует также учитывать и другие пробелы.

#include <iostream>

bool IsWhiteSpaceOrEnd(char c) {
    switch (c) {
    case ' ':
    case '\t':
    case '\r':
    case '\n':
    case 0:
        return true;
    }
    return false;
}

void ReverseWord(char* begin, char* end) {
    --end;
    while (begin < end) {
        char temp = *begin;
        *begin = *end;
        *end = temp;
        ++begin;
        --end;
    }
}

void ReverseEachWord(char* str) {
    char* begin = str;
    while (0 != *begin) {
        char* end = begin + 1;
        // find next end of word
        while (!IsWhiteSpaceOrEnd(*end)) {
            ++end;
        }
        // reverse the word between begin and end
        ReverseWord(begin, end);
        begin = end;
        // go forward to the next begin of a word
        while ((0 != *begin) && IsWhiteSpaceOrEnd(*begin)) {
            ++begin;
        }
    }
}

int main(int argc, char** argv)
{
    char* text = strdup("I am new");
    ReverseEachWord(text);
    return 0;
}

Спасибо, это действительно понятно, хотя я делаю простенькую программу, буду иметь это в виду на будущее!

Eddie 18.12.2018 17:41

Я бы преобразовал ввод и вывод массива символов в строки, по крайней мере, для обработки. Вы можете преобразовать результат обратно в массив символов, если вам это действительно нужно.

string ReverseText(const string& text)
{
    string word(""), result("");

    for (const auto& character : text)
    {
        if (!isspace(character))
            word += character;  // Build the next word to reverse
        else
        {
            std::reverse(word.begin(), word.end()); // Reverse the completed word
            result += word + character; // Add your processed word to the result
            word = "";  // Clear word variable for next iteration
        }
    }

    std::reverse(word.begin(), word.end()); // Don't forget the last word built
    return result + word;
}

Мне нужен массив char, поэтому я задал вопрос.

Eddie 19.12.2018 11:14

Другие вопросы по теме