[c++] 1. Zeichen in char* löschen

Urgs, sei mir nicht böse, aber das ist extrem unlesbar.

Hallo Endurion

Selbstverständlich bin ich dir nicht böse wegen so etwas, jeder hat ein Recht auf seine Meinung, aber ich denke es ist dir auch klar, dass ich diese Aussage so nicht stehen lassen kann, da sie schlicht falsch ist. Ich bin einverstanden, dass deine Variante marginal lesbarer ist (hauptsächlich weil die Stringklasse unverständlicherweise keine substr-Methode anbietet die mit Iteratoren arbeitet), allerdings kann hier weder von "unlesbar" noch "extrem" die Rede sein. Ob ich jetzt mit number.end() prüfe oder std::string::npos sollte nicht dazu führen dass allen Lesern nur ein "Holy crap"-mässiges Fragezeichen im Kopf stehen bleibt. Auf weitere Aspekte wie Erweiterbarkeit (wie viele Collections haben find_first_not_of als Member und bei wie vielen Collections funktioniert std::find?) möchte ich hier nicht eingehen, das ist ja so gesehen nicht das Thema und es ist am Ende nichts weiter als eine subjektive Meinung.

Und es ist C++11, das hat man auch evtl. nicht zur Verfügung.

Dies kannst du so nicht sagen. Visual Studio unterstützt den C++11 Standard noch lange nicht, dennoch kann ich schon seit ca. 3 Jahren Lambdaausdrücke verwenden. Das selbe gilt auch für GCC, da sind Lambdaausdrücke auch schon ziemlich genau 3 Jahre offizielle supported. Man kann also getrost Lambdaausdrücke verwenden (ausser man verwendet clang, die sind was C++-Features anbelangt immer etwas hinterher, aber wer tut das schon für C++?) ohne sich irgendwelche Gedanken machen zu müssen. Im Gegensatz zu Betriebssystemen werden Compiler je länger je mehr ziemlich schnell auf den neusten Stand gebracht.

Grüsse
Cromon
 
Vielen Dank für eure Lösungen! Danke dass ihr euch Zeit genommen habt mir zu helfen.
Ich will aber lieber nichts verwenden, dass ich selber nicht zu 100% verstehe und reproduzieren kann.
Darum habe ich versucht eure Ansätze in etwas umzuschreiben, was sozusagen von mir kommt. Außerdem hat mir die Diskussion folgende meiner Denkfehler aufgezeigt:
Wenn Parameter übergeben werden, kann man diese unter Umständen nicht überschreiben (fixe Strinliterale),
man kann Zeichenketten nicht einfach mit '=' in eine andere kopieren.

Hier meine Lösung:
C++:
      //check for Leading zero, and cut eventually
      int i=0;
      while ((number[i]=='0')&&((strlen(number)-i)>1)){
         i++;
      }
      int l= strlen(number)-i;
      
      char* numwozero = new char[l];
      for(int j=0;j<l;j++){
         numwozero[j]=number[j+i];
      }
...
delete[] numwozero;

Ich lasse das Thema noch kurz offen, und werde es dann als beantwortet markieren! Vielen Dank nochmals!
 
Das schaut gut aus.

Nur etwas noch:
Beim j<l der for-Schleife eher j<(l+1) nehmen,
damit das Stringende-Zeichen am Schluss auch mitkopiert wird.

(Dass bei lauter Nullen eine am Schluss übrig bleibt, statt einem komplett leeren String,
ist wohl beabsichtigt(?) Hab bei meinem Code oben nicht so weit gedacht :))
 
Gute Tipp, bei einem Test mit cout kam nach der letzten Stelle immer noch Müll.
Vorweg: so siehts jetzt aus

C++:
      for(int j=0;j=l;j++){
         numwozero[j]=number[j+i];
      }

Ich dachte aber dass
C++:
char* numwozero = new char[l];
folgende Gestalt hat:
numwozero[#]01...l-1l
Element1.Element2.Element...l-tes Element\0

Also, dass im l-ten Element sowieso der "Schlosstoken" drinnen steht, und ich das somit nicht überschreiben muss.
 
Genau :kopfaufdentisch: beim new muss auch +1 hin

Wenn man als Beispiel hallo nimmt (5 Buchstaben)
0 h, 1 a, 2 l, 3 l, 4 o, 5 Endzeichen
sind 6 Stück. Bei new gehört die Anzahl rein, nicht der max.Index, also 6

Und strlen liefert auch eine Anzahl, aber ohne Endzeichen.
hallo hat 5 Buchstaben, also 5.

Mal angenommen, es sind keine 0´s zu entfernen,
also streln minus 0 ist die volle strlen in Variable l.

Dann geht die Schleife solange i < l ist
0 1 2 3 4
h a l l o
Und das Endzeichen?


PS: Das j=l i letzen beitrag sollte doch j<=l heißen, oder?
 
j ist jetzt *<=* l

und prompt bekomme ich eine Fehlermeldung:

edit: Sorry, vergessen zu schreiben: der Fehler kommt im Schritt

C++:
delete[] numwozero;
 

Anhänge

  • fehler.PNG
    fehler.PNG
    10,4 KB · Aufrufe: 8
Zuletzt bearbeitet:
Zurück