Мне нужно создать функцию, которая меняет местами слова, записанные в массиве символов.
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
Надеюсь, вы поняли, что я имел в виду, поскольку я новичок в программировании и действительно нуждаюсь в помощи.
задача почти тривиальна, если вы храните слова как std::string
s, возможно, в std::vector<std::string>
Возможный дубликат как распечатать массив в обратном направлении
@Blaze это не дубликат, если я правильно прочитал другой вопрос. Здесь OP не хочет, чтобы весь массив был перевернут, а перевернуты только слова в строке (но порядок слов не изменился)
Совет: не создавайте аргументы, подобные char m[50]
, вместо этого используйте char*
или, поскольку это код C++, const std::string&
.
@Eddie duplicate of [Превращает все символы символов в обратную сторону, используя getline, array в C++] (stackoverflow.com/questions/53816331/…)
Если вам нужно решение на 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 это простой способ, работа с массивами символов сложна: P
Если под упрощением вы имеете в виду использование массивов char
, то вы можете в основном использовать тот же код, просто замените std::string::find
на strchr
. std::reverse
будет работать как с указателями, так и с итераторами.
В этом случае std :: find делает вещи немного более компактными
Поскольку слова могут быть разделены не только пробелом, следует также учитывать и другие пробелы.
#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;
}
Спасибо, это действительно понятно, хотя я делаю простенькую программу, буду иметь это в виду на будущее!
Я бы преобразовал ввод и вывод массива символов в строки, по крайней мере, для обработки. Вы можете преобразовать результат обратно в массив символов, если вам это действительно нужно.
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, поэтому я задал вопрос.
Возможный дубликат stackoverflow.com/questions/30834885/…