toupper-Funktion mit Pointer
-
Du solltest den Parameter für toupper() noch einmal überdenken.
zwerg1221 schrieb:
Stimmt doch, dass die int dann die Speicheradressen sind und eben die chars meine Strings.
Ein char ist immer nur ein Zeichen, welches nichts anderes ist als eine Zahl.
Folgendes ist problemlos möglich:int i = 'c; char c = i;
Fürs Pointer gucken:
void foo(char *dest, const char *src) { while (*src != '\0') *dest++ = toupper(*src), ++src; *dest = *src; }
-
#include<stdio.h> #include<ctype.h> char * strtoupper (char * destination, const char * source) { int x =0; while (source[x] != '\0') { destination[x]=toupper(source[x]); ++x; } return &destination[0]; } int main() { char str[]="inPut", destination[1000], *source; source=str; strtoupper(destination,source); printf("%s\n",destination); return 0; }
Welche Schulnote wäre dieses funktionierende und weil auf deinem Code basierend nicht optimale Beispiel wert?
-
char* str_toupper(char* src, char* dest) { int i = 0; while(src[i] != 0) dest[i] = toupper(src[i++]); return dest; }
-
zwerg1221 schrieb:
destination=source[x]; destination[x]=(char)toupper(*destination); ++x; }
Das Ding kann so nicht funktionieren - du überschreibst die Zieladresse mit einem Zahlen- bzw. ASCII-Wert und nutzt diesen dann als Adresse, um den Zielwert zu ermitteln. Wenn du schon einen Zwischenspeicher verwenden willst, dann nimm dafür eine char-Variable:
char temp = source[x]; destination[x] = toupper(temp); // oder noch kürzer destination[x] = toupper(source[x]);
-
src schrieb:
char* str_toupper(char* src, char* dest)
Schau dir mal die Reihenfolge der Parameter bei den Funktionen aus string.h an.
Da steht das Ziel an erster Stelle.
Nach dem MottoZiel = Quelle
, sollte der Aufruf auchstr_toupper(Ziel, Quelle)
sein.
-
DirkB schrieb:
char* str_toupper(char* src, char* dest)
...
Da steht das Ziel an erster Stelle.
-
http://de.pons.eu/dict/search/results/?l=deen&q=source
http://de.pons.eu/dict/search/results/?l=deen&q=destination
-
Hallo,
vielen Dank euch allen!!! Da hab ich jetzt erstmal was zum dran anknüpfen und werd ne Weile brauchen, bis ich dass jetzt implementiert hab.cooky451 schrieb:
[/cpp]Haha
jede Woche ein neuer Klassiker; letzte Woche habe ich den hier verbrochen
for (i=0; i < N; ++i) {for (j=0; j< i; ++j) {if (i == j) spur += V[i][j];
und habe mich ewig++ gewundert, warum da immer 0 rauskommt
.
-
my oh my schrieb:
DirkB schrieb:
char* str_toupper(char* src, char* dest)
...
Da steht das Ziel an erster Stelle.Das
char* str_toupper(char* src, char* dest)
stammt von src, nicht von mir!
-
Hallo Leute,
nachdem ich es jetzt dank eurer Hilfe ein wenig mehr begriffen habe und einiges dazu programmiert habe, hänge ich wieder an der selben Stelle fest. Diesmal wird mein Wort groß ausgegeben aber auf wundersame Weise werden immer zwei Zeilen dazu gepackt und ab und zu mit irgendwelchen zufälligen Dingen beschrieben. Ich versteh einfach nicht warum.
Vielleicht kann jemand nochmal einen Blick drüber werfen, oder kennt den Fehler.#include<stdio.h> #include<string.h> #include<ctype.h> #define MAX 100 char * strtoupper (char * destination, char * source) /*Funktion zur "Großstellen eines char */ { int x =0; while (*source != '\0') { *destination++ = toupper(*source++); } return &destination[0]; } char * strinv (char * destination, const char * source) { { destination += strlen(source); *destination=0; while (*source) *(--destination)=*source++; } return &destination[0]; } main() { char destination[MAX], *source, str[MAX], str1[MAX], str2[MAX]; printf( " Bitte string eingeben: "); fgets(str,MAX,stdin); source=str; strtoupper(str1,source); printf("%s\n",str1); source=str1; strinv(str2,source); printf("%s\n",str2); }
Vielen Dank
Gruß
-
Deine Funktion kopiert das '\0' nicht, zudem ist "return &destination[0]" sinnlos, da destination jetzt nur noch auf ein '\0' zeigt. Entweder ne void Funktion draus machen oder den Anfang zwischenspeichern.
-
Du musst bi
strtoupper
die '\0' am Ende vom String mit kopieren.
Außerdem ist das&destination[0];
zu viel des Guten.
Ein einfachesdestination
reicht da vollkommen.
-
Du hast beim Übertragen der Strings vergessen, den Null-Terminator im Zielstring zu setzen.
PS: Das Gebastel mit dem source-Pointer in der main() ist unnötig und das Array destination nimmt nur Platz weg.
-
Bei
strinv
hat er doch durchdestination += strlen(source); *destination=0;
die '\0' eingebaut. Und die '\0' aus source kopiert er nicht mit.
-
DirkB schrieb:
Bei
strinv
hat er doch durchdestination += strlen(source); *destination=0;
die '\0' eingebaut. Und die '\0' aus source kopiert er nicht mit.
Aber dort wird als Quelle das Ergebnis des strtoupper()-Aufrufs verwendet - Garbage In, Garbage Out
-
CStoll schrieb:
Garbage In, Garbage Out
Ist schon klar. Aber immer noch besser als Garbage In -> Absturz.
Obwohl das bei solchen Fehlern auch passieren kann.
-
Hallo,
danke jetz hab ichs gesehen, ein wenig gegrübelt und wieder etwas mehr verstanden. Muss dazu sagen, dass ich hier einige Bücher rumfahren habe, da ist schon allein aus Zeitgründen einiges abgeschaut. Aber daswhile (*source != '\0')
war auf meinem Mist gewachsen
DirkB schrieb:
Bei
strinv
hat er doch durchdestination += strlen(source); *destination=0;
die '\0' eingebaut. Und die '\0' aus source kopiert er nicht mit.
Danke dafür und allen anderen auch!!!
Schöne Woche!Gruß
-
zwerg1221 schrieb:
Aber das
while (*source != '\0')
war auf meinem Mist gewachsen
Ist so auch völlig richtig.
Nur wird, wenn
*source
gleich '\0' ist, die Schleife abgebrochen. Die '\0' wird nicht mehr kopiert.
Da du aber weißt, das da eine '\0' steht, kannstdu sie per Hand reinkopieren.while (*source != '\0') { Schleife mit source++ } *source = '\0'; return destination;
-
Hallo DirkB,
das funktioniert so aber leider auch nicht, er haut mir da wieder jede Menge Unfug rein. Aber irgendwie funktioniert das jetzt alles nichtmehr, er gibt mir nurnoch 3 Stellen an, den Rest vergisst er...
Oh Mann... und wär das nicht genug hab ich gerade erfahren, dass ich den string über ein Kommandozeilenargumentmain ( int argc, char * argv[] );
einlesen soll. Und das will mal sowas von nicht funktionieren...
boah!
-
void str_toupper(char *str) { while (*str) *str = toupper(*str), ++str; } void str_reverse(char *str) { char tmp; int len = strlen(str) - 1; for (int i = 0; i < len / 2; ++i) { tmp = str[i]; str[i] = str[len - i]; str[len - i] = tmp; } } int main(int argc, char *argv[]) { if (argc < 2) return 0; printf("%s\n", argv[1]); str_toupper(argv[1]); str_reverse(argv[1]); printf("%s\n", argv[1]); }