строка — C ++ делает то, что хочет | Char [] cout и перевернутый char []

Я на самом деле работаю над C ++ Invert String / Char [] Методы

#include <iostream>

using namespace std;

void inverse(string input)
{
int length = input.length();
char* output = new char[length];

for(int i = 0; i < length; i++)
{
output[length - (i + 1)] = input[i];
}

cout << output << endl;
delete output;
}

int main(int argc, char *argv[])
{
while(true)
{
string in;
cin >> in;
inverse(in);
}

return 0;
}

Проблема в том, что когда я ввожу строку с 3/5/7 и т. Д. Буквами, то она будет инвертирована, затем, если она верна, но если я введу строку длиной 2/4/6 и т. Д., Символы перевернутой строки имеет случайные символы на его и и только когда я ввожу эти длины числа.

Я так запутался, потому что эта ошибка появляется только с четными числами.

Вот небольшой пример:
Вот небольшой пример:

Вот новый код (здесь все работает отлично), я знаю, что он как-то связан с / 0 в конце массива, но почему только четные числа.

#include <iostream>

using namespace std;

void inverse(string input)
{
int length = input.length();
char* output = new char[length + 1];

for(int i = 0; i < length; i++)
{
output[length - (i + 1)] = input[i];
}

output[length] = '\0';
cout << output << endl;
delete output;
}

int main(int argc, char *argv[])
{
while(true)
{
string in;
cin >> in;
inverse(in);
}

return 0;
}

Кто-нибудь может помочь мне найти решение для этого?

3

Решение

Ваша строка не заканчивается нулем. Пытаться

void inverse(string input)
{
reverse( input.begin(), input.end() );
cout << input << endl;
}

Чтобы это работало, вам нужно включить algorithm заголовок, который определяет std::reverse() функция.

Причиной того, что она не работает для четных чисел, может быть тот факт, что выделения памяти обычно резервируют немного больше памяти, так что границы памяти выровнены должным образом. Поэтому округление до четных чисел не является пустой тратой. Это всего лишь предположение. Однако я настоятельно рекомендую вам избегать неопределенного поведения.

3

Другие решения

У вас есть мусор в конце вашей строки, потому что это не закончилось \0, Печать таких строк — неопределенное поведение в c ++.

Тебе просто повезло, что твой код работал даже на одинаковую длину. На моей машине, например, он хорошо работает для длины 1,2,3,5,6,7 и 8 и печатает мусор для 4.

UP: На самом деле, старайтесь избегать UB: стандарт c ++ не определяет, что происходит, когда у вас есть UB — теоретически, ваша программа может зависнуть, или ваш компьютер может взорваться, или демон может появиться из вашего носа. В этом конкретном случае я бы рекомендовал использовать std::string в качестве контейнера для output если вы по какой-то причине не можете использовать std::reverse или вручную сделать всю работу на месте.

0

По вопросам рекламы [email protected]