@IB1

Как передать динамический массив в функцию?

Вот такое задание:
Напишите функцию reversit(), которая переворачивает строку (массив типа char). Используйте цикл for, который меняет местами первый и последний символы, затем следующие и т. д. до предпоследнего. Строка должна передаваться в функцию reversit() как аргумент.
Напишите программу для выполнения функции reversit(). Программа должна принимать строку от пользователя, вызывать функцию reversit(), а затем выводить полученный результат. Используйте метод ввода, который позволяет использовать внутренние пробелы.

Код:
string reversit(char * chars)
{
	char a;
	if (sizeof(chars) % 2 == 0)
	{
		for (int i = 0; i <= sizeof(*chars) / 2; i++)
		{
			a = chars[i];
			chars[i] = chars[sizeof(chars) - i];
			chars[sizeof(chars) - i] = a;
		}
	}
	else
	{
		for (int i = 0; i <= sizeof(*chars) / 2 + 1; i++)
		{
			a = chars[i];
			chars[i] = chars[sizeof(chars) - i];
			chars[sizeof(chars) - i] = a;
		}
	}
	std::string str2(chars);
	
	return str2;
}

void task3()
{
	string str1;
	cin >> str1;
	const char *chars = str1.c_str();
	cout << reversit(chars);
}
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ответы на вопрос 2
@res2001
Developer, ex-admin
sizeof(chars) в результате дает размер указателя (8 - для x64 систем, 4 - для х32 систем), а не размер строки. Чтоб получить размер строки надо его передать в функцию (str.size()) или вызвать strlen уже внутри.
sizeof(*chars) всегда в результате равен 1, т.к. размер char по стандарту 1 байт.

Вам не нужно 2 цикла. Я так понимаю, вы хотели различать четное и не четное количество символов в строке.
Но если количество элементов четное, то мы должны обработать все элементы массива при этом количество итераций цикла будет strlen(chars)/2. А если количество элементов не четное, то центральный элемент мы пропускаем и количество итераций будет то же strlen(chars)/2, за счет того, что тут используется целочисленное деление и остаток от деления отбрасывается.

В функцию можно передавать ссылку на объект string, а не сырой массив (c_str()). string позволяет обращаться на прямую к каждому символу отдельно с помощью операции индексации (str[i], так же как и сырые массивы). При этом возвращать что-либо из функции не нужно, т.к. вы будете манипулировать непосредственно данными самого объекта и все изменения будут видны в main.
Ответ написан
Комментировать
vabka
@vabka
Токсичный шарпист
Убери const
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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