Hilfe mit substr()

@deepthroat:

Hab mal dein Beispiel ausprobiert:

Code:
istringstream cmdline (Input.substr (8));
				 string str;

			 if (cmdline >> str >> str) 
			 cout << str << endl; // str == 123

Aber wie kann man mit der Methode parameter dynamisch auslesen, bei dem Bsp von oben wird der 2 parameter ausgelesen. Ich will z.b. sowas eingeben wie "client Host PORT", jetzt muss erkannt werden das es zwei parameter sind
 
Also das funktioniert dann so:
Code:
istringstream cmdline (Input);

string cmd;
list<string> params;

if (cmdline >> cmd) {
  string tmp;
  while (cmdline >> tmp) {
    list.push_back (tmp);
  }
} else {
  /* Leerzeile */
}

Das Ganze könntest du natürlich auch wieder in eine Klasse packen.

/edit: Die Anzahl der Parameter kannst du dann durch params.size () abfragen.

Gruß
 
Code:
 istringstream cmdline (Input);
 
 				string cmd;
 				list<string> params;
 
 				if (cmdline >> cmd) 
 				{
					string tmp;
 					while (cmdline >> tmp) 
 					{
 		 		list.push_back (tmp); // error C2143: Syntaxfehler : Fehlendes ';' vor '.'
 					}
 				} 
 				else 
 				{
 					/* Leerzeile */
 				}
So hab 2 Fehler gefunden und 10 Warnungen
 
also bei mir passiert nix wenn ich etwas eingebe, komisch

Code:
if (cmdline >> str) 
			 {
				cout << "Parameter: " << str;
			 }

			 else 
			 {
				 cout << "Kein Parameter";
			 }
Wie kann ich damit feststellen ob der parameter übergeben wird, denn mit meiner methode geht es nicht.
 
Zeig mal bitte etwas mehr Code (vor allem wie du den istringstream "cmdline" initialisierst).

Wie machst du denn die Eingabe und was gibst du ein?
 
Code:
else if(!Input.find("test"))
	{
			if(Input.length() > 5)
			{
				istringstream cmdline (Input.substr(5));

				string cmd;
				list<string> params;
				
				if (cmdline >> cmd) 
				{
					string tmp;
					while (cmdline >> tmp) 
					{
    		    		params.push_back (tmp);
    		    		    		    		    		    	
					}
				} 
				else 
				{
    		    	cout << "Leerzeile" << endl; 
				}
			}
	}
 
Also du solltest natürlich die ganze Eingabe an den istringstream übergeben und nicht nur einen substring. Was für ein Kommando das war und die entsprechenden Aktionen führst du erst aus wenn die komplette Zeile bearbeitet wurde.

Code:
istringstream cmdline ("test Hallo 123");

string cmd;
list<string> params;

if (cmdline >> cmd) {
  string tmp;
  while (cmdline >> tmp) {
    params.push_back (tmp);
  }

  if (cmd == "test") {
    /* das Kommando test muß 2 Parameter haben */
    if (params.size () == 2) {
      /* ... */
    } else {
      /* Fehler: falsche Anzahl von Parametern. */
    }
  } else if (cmd == "host") {
    /* usw. ... */
  }
} else {
  /* Leerzeile */
}

Warum das nun bei deinem Testcode den du vorher gepostet hast nicht funktioniert kann ich nicht sagen. Dazu müßtest du mal den relevanten Code posten.

Gruß
 
Gut der Code funktioniert THX. Bei mir werden 14 Warnungen ausgegeben wie z.b:

warning C4786: '?$reverse_bidirectional_iterator@Viterator@?$list@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allo

Ist das schlimm?
 
Hab eine Eingabe, mit der man befehle eingeben kann, jetzt weiß ich nicht wo ich dein code einfügen soll:

Code:
  char eingabe = '\0';
 string str;	//Eingabe String
  
 string Input; 
 list<string> params;
 
 
 	do
 	{
 		Input_Pfeil("");
 		
 		//getline(cin, Input);
 		fontGreen();
 		//cin >> Input;
 		cin.get(eingabe);
 
 		if(eingabe != '\n')
 		{
 			getline(cin, str);
     	    str.insert(0,eingabe);	    	
 		}
 
 		if(str.length() == NULL)
 		{
 			//cout << "leer";
 			//Input_Pfeil("");
 		}
 
 		//------ Unbekannter Befehl ------------------------------------
 		else
 		{
 		cout << "Der Befehl: " << str << " ist unbekannt" << endl;
 		}
 
 
 		str.erase(str.begin(),str.end());//Löscht den Input Inhalt
 	}
 	while(1);
 
 	
 	return 0;
 }
 
Zurück