String in Klein-/Großbuchstaben wandeln - eigene Methode
-
Kann natürlich sein, aber sein Artikel sieht nicht danach aus.
-
Shlo schrieb:
Bashar schrieb:
tolower/toupper seien dir ans Herz gelegt.
Ich glaube, er darf solche Funktionen nicht nutzen...
Exakt. Ich benötige eigene Routinen.
Bashar schrieb:
Du musst die Maske invertieren:
Wobei das natürlich suboptimal ist, weil es Zahlen, Satzzeichen u.a. ebenfalls umwandelt. tolower/toupper seien dir ans Herz gelegt.Ja, danke so klappts. Ist mir aber nicht ganz klar waum das auch noch.
Die Zahlen und Satzen werden nur von Klein nach Groß, andersherum nicht, komisch ...
-
wäre das hier dann langsamer?
for(int i=0; i<len ;i++){ if( src[i]>='A' && src[i]<='Z' ){ src[i] += 32; } }
wie sicher ist es, daß a und A bei verschiedenen Plattformen/Systemen im ASCII gleich weit entfernt sind? gar nicht, oder? Dann wäre meine Code nämlich Kot
-
der ASCII Standard definiert doch wo die Zeichen liegen, auf allen ASCII Systemen liegt a und A gleich weit ausseinander.
Und dein Code dürfe langsamer als die oben genannte Lösung sein und vermutlich auch langsamer als die Benutzung von tolower
-
okay, also trotzdem ***
Frage eines DAU:
Was ist |= ?? Bitweise oder-Verknüpfung (oder wie würde man das bezeichnen) oder sozusagen ein bitweises+= ?
-
| ist bitweises Oder, |= ist bitweises Oder mit Zuweisung, analog zu +/+= usw.
-
thanx'! Da tun' sich ja unheimlich viele neue Möglichkeiten auf
*scharr-mit-den-Hufen*
sorry, wenn ich immer solche dau-like Fragen stelle, aber bin halt noch neu im Geschäft.
-
...und weiter geht es:
int len = 256; char row[256]={"HALLO, DAS IST EIn TExT;;** MIT VERScHIEDENEN zEICHEn@\0"}; //mit bitweisem ODER: const int LOW_DIFF = 32;//==0x20=='a'-'A' char * src = row; while(len--) { *src++ |= LOW_DIFF; } cout<<row<<endl;
1st question: wie unterdrücke/kriege ich den Datenschrott, den ich nach der Umwandlung in meinem string habe weg?
2nd question: der Code verändert aber auch alle anderen Zeichen und nicht nur die Großbuchstaben
die ganzen Probleme hätte ich aber doch mit diesem Code nicht:for(int i=0; i<len ;i++){ row[i]=tolower(row[i]); }
oder diesem:
for(int i=0; i<len ;i++){ if( row[i]>='A' && row[i]<='Z' ){ row[i] += 32; ///*oder:*/row[i] = (int)row[i]+32; //32==0x20=='a'-'A' } }
warte auf Kritik...
aber bitte nicht schlagen
-
sorry, habe gerade gesehen, daß tolower() nicht benutzt werden darf;-(
-
zu 1st question: Was ist denn für dich Datenschrott?
zu 2nd question: korrekt
-
groovemaster2002 schrieb:
zu 1st question: Was ist denn für dich Datenschrott?
Das was hinter dem Stringendezeichen steht, welches leider durch ein Leerzeichen ersetzt wurde und somit kein Endezeichen mehr ist. Mit len = strlen(row) sollte sich das erübrigen.
-
nun ja, schau es dir doch mal an: wenn row mit zB cout auf Konsole ausegegeben wird, dann werden am Ende bei dem ersten Code-Bsp noch irgend welche anderen Zeichen (von mir als 'Schrott' bezeichnet) ausgegeben, obwohl row '\0' terminiert ist.
-
@Bashar: year, that's it! thanx'
aber zweiteres bleibt (keine Einschränkung auf Großbuchstaben beim Verändern)
-
Bashar schrieb:
Das was hinter dem Stringendezeichen steht, welches leider durch ein Leerzeichen ersetzt wurde und somit kein Endezeichen mehr ist. Mit len = strlen(row) sollte sich das erübrigen.
Man sollte sich die Codes halt doch 2x durch den Kopf gehen lassen. Ist schon echt witzig auf was für Ideen Leute beim Programmieren so kommen.
-
ich habe mir das mal angeschaut...
kann es sein das es so vielleicht schneller und ohne zeichen-salat ist??void strlower( char *src, int len = 0 ) { if( len == 0 ) len = strlen( src ); while(len--) { switch( *src ) { case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': *src++ |= 0x20; break; default: *src++; break; } } }
muss aba nicht sein. und bei mir lief es in den test immer alles glatt