Leerzeichen in Hochkommas nicht löschen

Mahatmas

Mitglied
Hallo zusammen,

hab mir eine kleine Funktion geschrieben, mit der ich bei Parametern die Leerzeichen löschen kann. Die Parameter sind in einer Textdatei durch tabs getrennt. Jetzt möchte ich jedoch die Leerzeichen, die in Hochkommas stehen, nicht löschen. Diese gehören nämlich dann zu einem String der zusammengesetzt werden soll.

Zur besseren Verständnis hier meine Textdatei:

Code:
	letter1	letter2	letter3
Print Some Letters	F	L	O

	first number	second number	third number
Print Some Numbers	&43 2+ 8-10	&variable=6	&"hello "+"world"

	kommentar1	kommentar2	kommentar3
Print Some Comments	blabla	blablabla	bla

Also die Leerzeichen in der Rechnung "43 2+ 8-10" werden gelöscht, jedoch will ich das Leerzeichen bei "hello " nicht löschen.

Hier mein bisheriger Code:
Code:
int combine_Parameter()
{
	c_P++;
	
	if(int nPos = std::string::npos)
	{	
		for(nPos=0; nPos!=-1;)
		{
			nPos = para[c_P].find_first_of(" ");
			if( nPos != std::string::npos )
			{
				para[c_P].replace(nPos, 1, "");
			}
		}
	}
	if (c_P==anz_Para-1)		// ob alle Paramater behandelt wurden
	{
		return 0;
	}
	else
	{
		combine_Parameter();	// erneut aufrufen bis alle Parameter behandelt wurden	
	}
	
	return 0;
}

Ich hoffe, ich konnte mein Problem etwas verdeutlichen mit dem Beispiel. Wäre super wenn mir da jemand helfen könnt. Schon einmal danke im vorraus.

Gruß

Mahatmas
 
Hi.

Das Entfernen von Zeichen mitten aus einem String kostet relativ viel Zeit, da alle nachfolgenden Zeichen um eine Position verschoben werden müssen. Gerade wenn es wahrscheinlich mehrfach hintereinander gemacht werden muss, sollte man es lieber vermeiden.

Um nur bestimmte Leerzeichen zu entfernen, mußt du dir merken in welchem Kontext du bist - also ob du gerade innerhalb von Hochkommas bist oder nicht.

C++:
void remove_spaces(string& str) {
  enum { S1, S2 } state = S1;

  string temp;

  temp.reserve(str.size());
  
  for (string::iterator i = str.begin(); i != str.end(); ++i) {
    char c = *i;

    if (c != ' ' || state == S2) temp.push_back(c);
      
    if (c == '"') state = (state == S1 ? S2 : S1);
  }
  
  temp.swap(str);
}

string s = "abc + \"a b c\" + \"1   2\"";

remove_spaces(s);
cout << s;
Gruß

PS:
C++:
if(int nPos = std::string::npos)
Was soll diese Bedingung denn bedeuten? Die ist relativ unsinnig, da sie immer wahr ist. Außerdem ist std::string::npos nicht unbedingt ein int.
 
Zuletzt bearbeitet:
Was soll diese Bedingung denn bedeuten? Die ist relativ unsinnig, da sie immer wahr ist.

Mmmhh... Jetzt wo du es sagst, fällt es mir auch auf, dass das sinnlos ist. Ist wohl irgendwie beim rumprobieren übrig geblieben. Und da die Zeile ja keinen Fehler liefert, ist es mir auf anhieb gar nicht aufgefallen :-(

Erstmal Danke für deine Mühen.

Hab bei deinem Code aber noch ein Problem mit "push_back". Bringt mir eine Fehlermeldung zwecks Klasse.
error C2039: 'push_back' : is not a member of 'basic_string<char,struct std::char_traits<char>,class std::allocator<char> >'
Error executing cl.exe.
Hat push_back nicht etwas mit Vektoren zu tun?

Bin nicht so der Vollprofi, was programmieren angeht. Versuch deine Lösung zu verstehen und umzusetzen. Meld mich, wenn ich noch Fragen hab.
 
Hab bei deinem Code aber noch ein Problem mit "push_back". Bringt mir eine Fehlermeldung zwecks Klasse.

Hat push_back nicht etwas mit Vektoren zu tun?
Ja. Aber da ein String im Grunde nichts weiter ist als ein Vektor von Zeichen kann man ihn in C++ auch wie einen Vektor behandeln. Die push_back Methode ist laut C++ Standard eine Methode von std::basic_string (und somit auch von std::string). Hast du denn den <string> Header eingebunden? Welche Version vom Microsoft Studio benutzt du denn?

Gruß

PS: Anscheinend benutzt du VC 6.0. Das Ding ist nichtmal annährend konform zum C++ Standard. Du solltest dir einen aktuellen Compiler besorgen. Als Workaround (hoffentlich gibt's die append Methode):

C++:
// statt string.push_back()

string.append( 1, c);
 
Zuletzt bearbeitet:
Anscheinend benutzt du VC 6.0

Da hast du voll ins Schwarze getroffen. Bin bis jetzt zwar "fast" immer damit klar gekommen, aber hab schon von einem Freund gesagt bekommen, ich solle mir doch endlich mal einen aktuelleren Compiler besorgen :)

Aber mit "string.append( 1, c);" funktioniert es jetzt super.

Danke!

Gruß,
Mahatmas
 
Zurück