Problem beim debugen
-
Hi Leute
ich hab eine funktion geschrieben die alle Großbuchstaben in einem Wort /Statz in Kleinbuchstaben umwandelt(Unten...) Jetzt will ich diese Funktion in einer anderen Funktion aufrufen, was aber nicht geht! Beim kompillern gibts keine Problemme aber wenn ich es debuge /ausführe bringt er mir einen "Fehler" bei der angegebenen Zeile:
Main:int _tmain(int argc, _TCHAR* argv[]) { contains("Hallo Welt", "Hallo"); return 0; }Die contains() methode:
bool contains(char a[], char vgl[]){ char *c = to_lowercase(a); cout << c; return true; }und schließlich to_lowercase:
char *to_lowercase(char c[]){ int counter =0; int lenght = strlen(c); while (counter <= lenght){ if (c[counter] >= 65 && c[counter] <= 90){ c[counter] = c[counter]+32; <--Hier Fehler counter++; } else { counter++; } } return c; }Der "Fehler" sieht so aus:
Unbehandelte Ausnahme bei 0x0041183a in contains().exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00417704.Was läuft da Falsch?
-
warum nicht std::tolower?
du möchtest C-Strings verändern, dein Problem ist allerdings, dass es const char sind, und es nur ein überbleibsel aus alten tagen ist, dass diese auch als char* angesprochen werden können.
btw, es heißt length
-
Ich wollt einfach mal selber so ned funktion schreiben...
Und warum funktionierts dann hier in diesem Program? to_lowercase() ist genau die gleiche funktion!!!char *to_lowercase(char c[]){ int counter =0; int length = strlen(c); while (counter <= length){ if (c[counter] >= 65 && c[counter] <= 90){ c[counter] = c[counter]+32; counter++; } else { counter++; } } return c; } int _tmain(int argc, _TCHAR* argv[]){ char eingabe[100]; cin.getline(eingabe,99); char *c; c = to_lowercase(eingabe); cout << c; system("Pause"); return 0; }
-
while(counter <= length) müsste wohl < sein statt <=.
Desweiteren verändert to_lowercase den übergebenen String. Gewollt?
-
Ja des is gewolt das der übergebene String verändert wird(man braucht den ja nichtmeht) aber wie geht des?
queer_boy hat ja geschrieben das es eig ein const char ist!
ps:
ich hab meinen code jetzt mal verändert jetzt kommen aber nur noch komische zeichen!:char *to_lowercase(char temp[]){ int count = 0; int counter =0; while (temp[count] != '\0'){ count ++; } char *c = new char[count]; //int length = strlen(c); while (counter < count){ if (c[counter] >= 65 && c[counter] <= 90){ c[counter] = c[counter]+32; counter++; } else { counter++; } } return c; }
-
Sry für doppelpost...
lol hab mich a weng dumm angstellt*c = temp[0];sowas muss natürlich noch rein aber das oben stimmt noch ned ganz weil ja dann c nur auf das erste zeichen von temp zeigt wie kann man das ändern
-
char *toLowercase(char *source){ char *target = new char[strlen(source)+1]; for(int i = 0; i < strlen(source); i++){ if (source[i] >= 'A' && source[i] <= 'Z'){ target[i] = source[i] - ('A' - 'a'); }else{ target[i] = source[i]; } target[strlen(source)] = 0; } return target; }Natürlich musst du den zurückgegeben String irgendwann wieder freigeben. Und Umlaute sind auch nicht drin. Und const ist da gar nichts.
-
Danke! aber für was ist diese zeile hier gut:?
target[strlen(source)] = 0;ich weis nur das ohne die ned gut geht
-
Hier schreibst du das abschließende 0-Byte in deinen target-String.
-
Die klassischen C-Strings enden immer mit einer 0. (also dem Wert 0, nicht dem Ascii-Zeichen 0). Fehlt dieses, so liest die jeweilige Funktion fröhlich weiter im Speicher bis es diese findet und es kann sein, daß sie so in Bereiche kommt, in der sie nichts zu suchen hat. Das kann gut gehen, muss aber nicht.
Der String "HORST" hat also 6 Zeichen, nicht 5. Genau genommen: "HORST\0". strlen() gibt aber 5 zurück. Daher auch +1 bei der Länge.