Array Elementfelder verschieben?
-
Hallo zusammen!
Es gibt sicherlich eine Möglichkeit Array Elementfelder zu verschieben, oder?
z.B. bei der Eingabe wird vom Benutzer der string "hdk4ll7kj8k" eingegeben,
und das Programm soll die Zahlen löschen und die nachfolgenden Zeichen nach
links verrücken -> Ausgabe "hdkllkjk" und Anzahl der gelöschten Ziffern -> 3.Kann mir jemand helfen?
Vielen Dank für Eure Hilfe!
Gruss
FrankyB99
-
Ich weiß nicht, ob es Standard-C++ ist, aber mit IsNumeric oder IsAlpha kannst Du einzelne Zeichen prüfen und mit String::Delete(x,y) kanns Du einelne Zeichen aus dem String löschen.
-
Hmmm ich würde mal nach einer Ersetze-Funktion für Zeichen suchen.... Das was du möchtest ist ein Ersetzen der Zahlen durch nix
-
ich finde das von Joe besser...
einfach schauen ob es eine Zahl ist, und wenn ja, dann einfach löschen (da wird das nächste elemente ja rangeholt dann)
-
[quote="5er1al"]ich finde das von Joe besser...
einfach schauen ob es eine Zahl ist, und wenn ja, dann einfach löschen (da wird das nächste elemente ja rangeholt dann)[/quote]Hallo!
Danke für die schnelle Postings!
Wie würde dann der Code aussehen?Gruss
Franky
-
also ich hab mal eine möglichkeit....wird wohl auch noch anders gehen....
ACHTUNG nicht getestet:int main(int argc, char* argv[]) { string test = "ha23l5l3o"; for(int i=0;i<test.length();i++) { if(isdigit(test[i])) //schauen, ob aktuelleer string eine zahl ist test.replace(i,1," "); //wenn ja, mit leerzeichen ersetzen (denn mit //"Nichts" geht nicht } int pos=0; while(test.find(" ",pos)!=string::npos) //solange er Leerzeichen findet... { pos=test.find(" ",1); //Position ermitteln und.. test=test.erase(pos,1); //diese Position löschen } cout<<test; getch();return 0; }
Also das is mir spontan eingefallen.....
natürlich musst nochwas machen, das wenn am anfang eine zahl ist, das der da das leerzeichen auch entfernt...will ja nicht alles brühwarm herlegenwie gesagt, nicht komplett fehlerfrei....aber die dürftest selber entfernen
können![Edit] und natürlich isses besser, das in Funktionen zu machen....
-
5er1al schrieb:
//wenn ja, mit leerzeichen ersetzen (denn mit //"Nichts" geht nicht
#include <iostream> #include <string> using namespace std; inline void remDigits(string &s) { size_t i=0; while(i<s.length()) if(isdigit(s[i])) s.replace(i,1,""); else ++i; } int main() { string a = "0675h423a43l43255326426431l352o5436", b = "5423w5423352e53324909785l89769t5647"; remDigits(a); remDigits(b); cout << a << " " << b << endl; cin.get(); }
-
gibt auch memmove: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_memmove.asp
-
nillable schrieb:
s.replace(i,1,"");
hm....da bringt mein compiler nach wie vor einen fehler...
-
Morgen,
warum arbeitet ihr nicht mit std::string::erase?
mfg
v R
-
ja, da hatte ich aber gestern keinen quellcode im kopf!
-
s.replace(i,1,""); ?!?
dumdidum... glaube er mag keine Integerwerte in Strings suchen und ersetzen.
s.replace(i,"1","");
-
dachte der 2te paramter ist die länge(also ein int)!
Bin mir aber grad nich sicher...hab kein Borland hier wo ich schauen kann!serial!
-
@Mathias
http://www.cppreference.com/cppstring/replace.html@5er1al
Laut der Referenz (oberer Link) müsstest Du Recht haben. Nur der erste Parameter, der Startindex, bezieht sich auf den "source-string" und der zweite Parameter soll überaschenderweise die Länge des "replace-strings" angeben. Diese war in diesem Fall natürlich 0 und nicht 1, was zu einer Endlosschleife führen würde, da 0 Zeichen mit 0 Zeichen ersetzt werden würden. Aber sowohl der VC 7.1 als auch der g++ 3.4.2 beziehen auch die Länge der Zeichen auf den "source-string". Welchen Compiler hast Du denn? Was macht er, wenn du den "replace-string" nicht als Konstante übergibst?
Hier noch ein Beispiel mit konstanten "replace-strings"#include <iostream> #include <string> using namespace std; int main() { string a = "haxo", b = "wexxxt"; a.replace(2,1,"ll"); b.replace(2,3,"l"); cout << a << " " << b << endl;//hallo welt cin.get(); }
und eins mit variablen "replace-strings"
#include <iostream> #include <string> using namespace std; int main() { string a = "haxo", b = "wexxxt", ra="ll", rb ="l"; a.replace(2,1,ra); b.replace(2,3,rb); cout << a << " " << b << endl;//hallo welt cin.get(); }
Wie schon gesagt, mit g++ 3.4.2 und auch mit VC 7.1 funktioniert beides einwandfrei.
-
hm, wie schaut es damit aus:
int main() { std::string test = "0675h423a43l43255326426431l352o5436"; unsigned int Pos = 0; while ( (Pos = test.find_first_of("1234567890")) != std::string::npos ) test.erase(Pos, 1); std::cout << test << std::endl; std::cin.get(); return 0; }
Gruss,
DeSoVoDaMu
-
ich schätze find_first_of fängt jedes mal ne schleife an.
deshalb eher so wie schon gepostet nur mit erase:
[cpp]
#include <iostream>
#include <string>using namespace std;
inline void remDigits(string &s)
{
size_t i=0;while(i<s.length())
if(isdigit(s[i]))
s.erase(i,1);
else
++i;
}int main()
{
string a = "0675h423a43l43255326426431l352o5436", b = "5423w5423352e53324909785l89769t5647";remDigits(a);
remDigits(b);cout << a << " " << b << endl;
cin.get();
}
[/cpp]
Aber mit welchem Compiler das mit replace nicht geht würde mich schon interessieren.
-
@nillable: ich weiß nich ob wir aneinander vorbei reden...
ich meinte das:Mathias schrieb:
s.replace(i,"1","");
das geht bei BCB 6 nicht....logisch!
Keine Übereinstimmung für string::replace(int,char*,char*) gefunden
-
Ups, wenn der 2.Parameter die Länge des zu ersetzenden Strings ist habt ihr natürlich recht.
(Ehrlich gesagt hab ich mir mein Replace selbst geschrieben, weil ich keine so allgemeine Funktion gefunden habe, die man ohne Umwege fuer das gebrauchen kann wozu ich sie brauche...)
-
ich meinte eher das:
5er1al schrieb:
nillable schrieb:
s.replace(i,1,"");
hm....da bringt mein compiler nach wie vor einen fehler...
denn dafür gibt es ja standardmäßig eine Übereinstimmung
-
nillable schrieb:
ich meinte eher das:
5er1al schrieb:
nillable schrieb:
s.replace(i,1,"");
hm....da bringt mein compiler nach wie vor einen fehler...
denn dafür gibt es ja standardmäßig eine Übereinstimmung
oh ja da hatte ich mich wohl sehr schlecht ausgedrueckt!
Das geht natürlich!