@fiercekilla
Старательно изучаю всё подряд

Лишние символы в c++, откуда?

Есть код:
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
using namespace std;
 
char* reverse ( char *str )
 {
      int length_str = strlen(str);
      char *str2 = new char[length_str];
      for(int i=0;i<length_str;i++)
      str2[i]=str[length_str-i-1];
      
        return  str2;
 }
 
 int main()
 
 {
	 setlocale(LC_ALL,"RUS");
 char *array = new char;
 cin>>array;
 cout <<"Исходная строка >  "<< array << endl;
 char *str  = reverse(array);
 cout <<"Перевернутая строка >  "<< str<< endl;
 system("Pause");
 }


После запуска выдает следующее:
3345fd2d964f4ce58017641d6f730881.png

Откуда эти символы в перевернутой строке? И как их убрать?
  • Вопрос задан
  • 4529 просмотров
Решения вопроса 1
Во-первых, new char выделит память только для одного символа, а у вас их много. То есть уже в следующей строке (cin >> array) проезд по памяти. Если пишете в целях обучения и нельзя брать std::string, то выделяйте с запасом, например new char[256]; Освобождать при этом память надо будет при помощи delete[] array;
Во-вторых, конец строки определяется по нулевому символу на конце. cin >> array делает это сам (пишет в конец array нулевой символ), а вы в своей функции нулевой символ не выставляете. Сделать это можно так:
str[length_str] = '\0';
Но надо иметь в виду, что памяти надо выделить [хотя бы] на 1 больше, чем length_str.

Итого:
1. Вам надо в обоих случаях память выделять под массив. В первом случае можно под 256 элементов. В идеале при этом читать не при помощи cin, а другими функциями, дабы избежать переполнения на случай, если введут строку более длинную.
2. В reverse надо выставлять терминирующий нуль и исправить длину массива. Возможно вообще разворачивать строку по месту, т.е. менять местами буквы, а не создавать новую строку (в этом случае не надо ни память выделять, ни трогать терминирующий нуль, он останется на месте).
3. Вам надо удалять выделенную память по окончании использования при помощи delete []
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@vilgeforce
Раздолбай и программист
Нулевой символ в конце строки исчез...
Ответ написан
Комментировать
RiseOfDeath
@RiseOfDeath
Диванный эксперт.
Строкой (помимо класса std::string) в C/C++ называется массив char, оканчивающийся нулевым символом. (0x00 или '\0'). Все стандартные средства для работы со строками считают такой символ концом строки. А вы его перенесли вообще в начало.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы