Member 12771931 Ответов: 2

Указатели помогите пожалуйста


Главная проблема-линия 45:

#include <iostream>
#include <cstring>

using namespace std;
int SpacesRemoval(char* Str);

int main()
{
	char Str[100];
	cout << "Enter a sentence and I will strip out all of the spaces. " << endl;
	cin.getline(Str, 99);
	
	cout << "Your sentence without spaces in it is: " << endl;
	
	cout << "I removed " << SpacesRemoval(Str) << " spaces from the sentence." << endl;

	return 0;
}
int SpacesRemoval(char* Str)
{
	char* removal = Str;
	char* temp = Str;
	int len = strlen(Str);
	int count = 0;
	char *p;
	p = Str;
	
	
	while (*p)
	{
		switch (toupper(*p++))
		{
		case ' ':
			
			count++;
		}
	}
	while (*removal)
	{
		if (*removal != ' ')
			*temp++ = *removal;
		removal++;
	}
	*temp = 0;
	cout << Str << endl; // I am not supposed to use 'cout' in this function but I am confused in how to eliminate it, as the program doesn't work if I just remove it.
	return count;
}


Что я уже пробовал:

Я пытался найти способ с тех пор, как прошло около 3-4 часов, но все напрасно. Вот почему я решил спросить об этом в интернете. Спасибо

PIEBALDconsult

Ну, я должен предположить, что это домашнее задание, так что, может быть, вы должны показать нам задание, чтобы мы хотя бы могли увидеть, где вы заблудились.
(На самом деле мы, конечно, не будем делать вашу домашнюю работу, но вы довольно близки.

Просто отобразите исправленную строку после вызова SpacesRemoval(Str)

0) Почему вы используете toupper?
1) Вам не нужно использовать strlen.
2) вам не нужны две петли; одной будет достаточно.

Member 12771931

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

PIEBALDconsult

Ну, похоже, что вы в значительной степени там, вам просто нужно отобразить алетерную строку.

Member 12771931

Вот где я застрял, я пытался сделать это с самого утра, и теперь мой мозг полностью поджарился. Не могли бы вы мне помочь?

PIEBALDconsult

В основном, после вызова SpacesRemoval (Str) , дисплей Str.

Member 12771931

Он все еще остается прежним, если я не добавлю cout << Str << endl; в строке 45, программа при запуске не отображает предложение без пробелов. Он просто выводит количество удаленных пробелов.

PIEBALDconsult

Двигаться, что основным, после вызова SpacesRemoval(ул.)

Member 12771931

Спасибо, извините, что беспокою вас снова и снова, но теперь я должен переключить шаблон, например, предложение без пробелов должно быть сначала выведено, а затем удалено количество пробелов.

Jochen Arndt

Просто назначьте возвращаемое значение переменной:

инт удален = SpacesRemoval(ул.);

Затем распечатайте результаты, используя removed и Str по запросу.

Member 12771931

Спасибо вам всем за помощь. Я очень ценю это, спасибо.

2 Ответов

Рейтинг:
18

BacchusBeale

Все эти три переменные указывают на один и тот же адрес памяти:

char* removal = Str;
char* temp = Str;


так что если вы меняете один вы меняете все

*temp++ = *removal;

здесь вы присваиваете символу тот же массив символов (строка), а не новый

Я предлагаю использовать std:: string и добавить все символы, кроме пробелов
затем используйте strcpy


Jochen Arndt

Его код не очень умный, но он делает то, что должен.

Рейтинг:
0

KarstenK

У вас есть большая ошибка в вашей программе: вам нужно выделить некоторую память для результирующей строки, а не только указатель как и ваша температура, которая приближается к входу. Это не очень хороший стиль.

Самый простой способ - в основном:

char result[100] = {}; //provide clean memory
SpacesRemoval(Str, result)//additional parameter

//use 
cout << result;

и подпрограмма
int SpacesRemoval(char* Str, char *resBuffer)
{
 char *temp = resBuffer;//assign your temp pointer to real memory
}


Но очистка струн-это обычный вопрос для начинающих и домашних заданий, а также часто ответил.


Jochen Arndt

Почему возникает ошибка?
Он модифицирует существующую строку. Нет никаких проблем, если он больше не нуждается во вводе.

KarstenK

Изменение входного значения-это не очень хороший стиль. Пример: если он хочет повторно использовать код с каким-то строковым классом.

Любой человек должен "научиться кодировать" этот стиль ;-)