String in Klein-/Großbuchstaben wandeln - eigene Methode
-
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