Задать вопрос

Как убрать мусор из char массива?

Нужно сделать пересечение двух знаковых массивов. По большому счёту все работает но в конце всегда выводит несколько непонятных символов. Массив создается вроде корректно. Не могу понять в чем ошибка. Вот код метода :
String String::cross(const String& other)
{
	
	size_t size;
	size_t len1 = strlen(this->string_);
	size_t len2 = strlen(other.string_);
	if (len1 > len2)
	{
		size = len1;
	}
	else
	{
		size = len2;
	}

	size_t counter = 0;

	for (size_t i = 0; i < size; i++)
	{
		if (this->string_[i] == other.string_[i])
		{
			counter++;
		}
	}
	char* result = new char[counter+1];
	
	for (size_t i = 0; i < size; i++)
	{
		if (this->string_[i] == other.string_[i])
		{
			result[i] = this->string_[i];
		}
		else
		{
			result[i] = '_';
		}
	}
	
	return result;
}


и вот вывод :
Enter your string : hello

Enter your string : hola
h_l__¤¤


Помогите пожалуйста.
  • Вопрос задан
  • 572 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Что у вас за операция пересечения?

Первая проблема - вы берете максимальную длину двух строк в size и потом проходитесь циклом до size по обеим строкам. Но ведь более короткой строки там просто нет - вы обращаетесь к не вашей памяти.

Вам надо проверять, есть ли обе строки по индексу i, прежде чем сравнивать их.

Вторая проблема - вы создаете result размером ровно на количество совпадений, а пишете туда в цикле до size. Т.е. если у вас вообще ни одного совпадения, то массив result будет пустым, но вы там можете хоть 10000-ый элемент записать, если строки достаточно длинные.
Ответ написан
Комментировать
profesor08
@profesor08
Ты промахнулся. Тебе сначала надо выделить строковую переменную, длинна которой будет соответствовать максимальной длине твоих исходных строк (либо первой, либо второй). Далее, тебе надо пройтись про строкам сверяя их символы, но надо следить чтоб индекс не превышал длину минимальной из двух строк. Если превышает, то заполнять ее символами '_';

Не пример для подражания

#include <stdlib.h>
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string str1 = "hello";
    string str2 = "hola";
    size_t minStrSize = min(str1.size(), str2.size());
    size_t maxStrSize = max(str1.size(), str2.size());
    string result;
    
    if (str1.size() > str2.size())
    {
        result = str1;
    }
    else
    {
        result = str2;
    }
    
    for (size_t i = 0; i < maxStrSize; i++)
    {
        if (i < minStrSize)
        {
            if (str1[i] != str2[i])
            {
                result[i] = '_';
            }
        }
        else
        {
            result[i] = '_';
        }
    }
    
    cout << result;

    return 0;
}

Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы