• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Usunięcie nadmiaru spacji w ciągu znaków

Aruba Cloud - Virtual Private Server VPS
0 głosów
1,381 wizyt
pytanie zadane 13 grudnia 2016 w C i C++ przez Kamyyylo Początkujący (460 p.)

Mam do zrobienia taki program:

Napisz funkcję formatującą zadany tekst w taki sposób
aby kolejne wyrazy lub liczby były pooddzielane dokładnie pojedynczymi spacjami.
Np. zamienającą tekst ”AAA   BBBBB     C     DD     EEEE       ”
na ”AAA BBBBB C DD EEEE”

Mam kod usuwający z początku i końca spacje :

#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
	int  i, k;
	char ciag[100];
	cin.getline(ciag, 100);               
	while (ciag[0] == 32)            
	{
		i = 0;
		for (k = 1; ciag[i]!='\0'; k++)
		{
			ciag[i] = ciag[k];                  
			i++;                                
		}
	}
	i = 0;
	while (ciag[i] != 0)              
		i++;
	for (i--; ciag[i] == 32; i--)       
		ciag[i] = 0;                        
	cout << ciag << endl;         
	system("PAUSE");                   
	return 0;
}

Jednak nie wiem jak rozpisać kod żeby w środku usuwało nadmiar spacji. Ma ktoś jakiś pomysł ? 

 

1
komentarz 13 grudnia 2016 przez .kassad Gaduła (3,420 p.)
Przeszukujesz tablicę od lewej strony. Jeżeli i-ty wyraz tablicy jest spacją, sprawdzasz, czy wyraz i+1 też jest spacją. Jeżeli jest, przesuwasz wyraz spod indeksu i+2 na indeks i+1, i+3 na i+2 i tak aż do końca tablicy.

1 odpowiedź

0 głosów
odpowiedź 13 grudnia 2016 przez JojololomenPL Bywalec (2,580 p.)

Spróbuj czegoś takiego:


std::vector<std::string> words;
std::string help;

for(int i = 0; i < ciag.size(); ++i)
{
	if(ciag[i] != ' ')
		help += ciag[i];
	else
	{
		words.push_back(help);
		help = "";
	}
}

std::string result;

for(int i = 0; i < words.size(); ++i)
{
	result += words[i];
	result += " ";
}

 

komentarz 14 grudnia 2016 przez Kamyyylo Początkujący (460 p.)
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
	
	int  i, k;
	char ciag[100];
	cin.getline(ciag, 100);
	while (ciag[0] == ' ')
	{
		i = 0;
		for (k = 1; ciag[i] != '\0'; k++)
		{
			ciag[i] = ciag[k];
			i++;
		}
	}
	i = 0;
	while (ciag[i] != 0)
		i++;
	for (i--; ciag[i] ==' '; i--)
		ciag[i] = 0;
	vector<string> words;
	string help;

	for (int i = 0; i < ciag.size(); ++i)
	{
		if (ciag[i] != ' ')
			help += ciag[i];
		else
		{
			words.push_back(help);
			help = "";
		}
	}

	string result;

	for (int i = 0; i < words.size(); ++i)
	{
		result += words[i];
		result += " ";
	}


	cout << ciag << endl;
	system("PAUSE");
	return 0;
}

 

Tak to ma wyglądać ? Pokazuje mi ze ciąg.size must have a class type. Czy nie ma jakiegoś innego sposobu na zrobienie tego ? za pomocą samych pętli np ? bez używania vector itp ? 

Podobne pytania

0 głosów
3 odpowiedzi 2,344 wizyt
0 głosów
1 odpowiedź 869 wizyt
pytanie zadane 18 czerwca 2021 w C# przez disaster Bywalec (2,120 p.)
0 głosów
0 odpowiedzi 371 wizyt
pytanie zadane 4 listopada 2020 w C i C++ przez saintx Nowicjusz (120 p.)

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,662 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...