[VC++ 6] tolower() für komplettes char-Array

@Kachelator:
Alles was ich weiß ist, dass char* test einen Pointer auf die Adresse des ersten Zeichens einer im Speicher abgelegten Zeichenkette darstellt. (test + 1) ist dann ein Pointer auf die Adresse des 2. Zeichens, usw.., bis irgendwann (test + x) auf ein Null-Byte zeigt.
Wenn das völlig falsch ist, dann bitte darum, mich zu korrigieren, denn dann habe ich so einiges falsch verstanden!
Was ich (bisher) nicht weiß ist, dass man den Inhalt einer durch char* repräsentierten Zeichenkette nicht ändern kann.

Ich habe den in meinem Eingangsposting erwähnten "Einzeiler" (die for(...) ...;-Zeile) irgendwo im Netz gefunden (weiß nicht mehr wo, kann aber nochmal googeln). Habe auch mehrere ähnliche Codeschnipsel gesehen. Deshalb wundert es mich halt, dass es nicht funktioniert...

Also, wenn ihr mir sagt, dass es eben einfach nicht möglich ist, ein durch den Zeiger char* repräsentierte Zeichenkette komplett in Kleinbuchstaben zu wandeln, ohne eine Kopie der gesamten Zeichenkette anzufertigen, dann gebe ich mich eben geschlagen und lasse euch in Frieden.

@Konsumierer:
Danke. Aber damit mach ich doch wieder eine Kopie. :(
 
Also ich hab durch Suchen herausgefunden, dass ein String den du mit char* String = "Stinniassdfasflösdf";
anlegst, in einem Teil des Programmspeichers gespeichert wird, auf den du nicht schreibend zugreifen kannst.

Benutze stattdessen einfach
Code:
char szString[] = "HALLO du DA";
Nun müsste die Schleife mit
Code:
for(int i = 0; szString[i]; i++)
funktionieren.
 
Ok, danke Konsumierer.
Ich kann nicht einfach char szString[] = "HALLO du DA"; benutzen, weil der Datentyp char* nun mal gegeben ist. Dass ich den in dem Testprogramm so "von Hand" zuweise, ist deshalb so, weil ich die späteren wirklichen Bedingungen simulieren will. Mag sein, dass es mit char szString[] = "HALLO du DA"; in dem testprogramm funktioniert, damit habe ich aber nichts gewonnen. (Ich dachte das hätte ich schon mal erwähnt.)

Aber Danke auf jeden Fall für die erste Aussage. Das heißt: Es geht nicht. Das zu wissen ist auch schon einiges wert.

Martin
 
Doch, natürlich hast du dadurch einiges gewonnen. Leg einfach einen Puffer an, der auf jeden Fall groß genug ist. Den char* kannst ja einfach da reinkopieren.
 
Die Aufgabenstellung war: Ohne Kopie.
Eine Lösung mit Kopie hatte ich schon (siehe mein Eingangs-Posting).
Aber wie gesagt: Hast mir schon sehr geholfen und mich von dem Wahn befreit, dass das doch effektiver gehen muss...;)
 
Hy!

Wenn du den char* nicht mit
Code:
char *text = "Test";
sondern mit
Code:
char *text = malloc( x*sizeof(char));
strcpy(....
Anlegst ist er in einem Speicherbereich abgelegt, den du ändern kannst. Vielleicht hilft das etwas, du müsstest in deinen eigentlichen Programm den Speicher nur so reservieren, ich nehme mal an das du dort doch auch nicht einen konstanten Wert zuweist, sondern den String auch von irgendeiner Funktion füllen lässt. Vielleicht hilft dir das ja weiter.

mfg
uhu01
 
Also, wenn ihr mir sagt, dass es eben einfach nicht möglich ist, ein durch den Zeiger char* repräsentierte Zeichenkette komplett in Kleinbuchstaben zu wandeln, ohne eine Kopie der gesamten Zeichenkette anzufertigen, dann gebe ich mich eben geschlagen und lasse euch in Frieden.
Natürlich geht das prinzipiell, ist aber nicht empfehlenswert mit einem Zeiger, der auf eine Zeichenkette zeigt, die als (implizit) konstante Zeichenkette zeigt, die als Stringliteral ("abc") quasi im Code existiert und nicht auf Stack oder Heap. (Ungenau ausgedrückt) Wenn du darauf schreibend zugreifst, ist das Verhalten nicht definiert. Das heisst: Eventuell klappt es, aber wahrscheinlich wird etwas beliebig Unangenehmes geschehen. Wenn dagegen Platz für das char-Array zur Verfügung gestellt wird (verschiedene Vorschläge siehe im Thread), ist es eigentlich kein Problem, die Umwandlung direkt im Array vorzunehmen.
 
Zurück