Stringteil kopieren
-
Hallo!
Ich verstehe nicht, warum das folgende Programm, welches Teile eines strings kopieren und ausgeben soll nicht funkt...
Könnte mir bitte jemand sagen, was ich falsch mache?Gruß
Apeiron
#include <stdio.h> #include <stdlib.h> char* substring(char*string , int S , int L){ char* sub=(char*)malloc(sizeof(char)*(L+1)); for(int i=S;i<=L;i++){ *(sub+i-S)=*(string+i-1); } return sub; } int main(){ char string[4]={1,2,3,4}; printf("%s",*substring(string,2,3)); getchar(); return 0; }
-
1.)
char string[4]={1,2,3,4};
ist kein String.
char string[5] = { '1', '2', '3', '4', 0}; char string[5] = "1234"; char string[] = "1234";
sind Strings.
2.) Du schließt Deinen "Rückgabestring" nicht ab -> Nullterminierung
3.)
printf("%s",*substring(string,2,3));
geht in die Hose, nimm
printf("%s",substring(string,2,3));
4.) Du holt Speicher, gibst ihn aber nicht mehr frei
-
Hallo nochmal und vielen Dank für deine Hilfe!
Ich habe das Programm jetzt folgendermaßen modifiziert und der 1. Teil läuft tatsächlich. Aber beim 2. Teil, der jetzt mithilfe von Kommandozeilenargumenten einen beliebigen Text einlesen und nur die Passage von S aus, mit der Länge L ausgeben soll läuft noch irgendetwas schief. Was mache ich falsch?
#include <stdlib.h> #include <stdio.h> #include <string.h> char* substring(char*string , int S , int L){ char* sub=(char*)malloc(sizeof(char)*(L+1)); for(int i=S;i<=L;i++){ *(sub+i-S)=*(string+i-1); } *(sub+L)='\0'; return sub; free(sub); } int main(int argc, char *argv[]) { int S=atoi(argv[argc-2]); int L=atoi(argv[argc-1]); int i, Laenge=0; for(i=0;i<argc;i++){ Laenge=Laenge+strlen(argv[i]); } for(i=0;i<Laenge;i++){ printf("%s",substring(argv[i],S,S+X)); } getchar(); return 0; }
-
Hallo,
printf("%s",substring(argv[i],S,S+X));
Wo sollen denn die ganzen argv[i] herkomen? Das geht nicht!
Gruß,
B.B.
-
@Apeiron: nichts für Ungut, aber ein bisschen mitdenken sollte man schon, nicht nur einfach Code reinschmeißen, und hoffen, dass es geht
nach dem 'return sub' ist es Schluß mit der Funktion, d.h. die free Zeile wird selbstverständlich *nie* ausgeführt.
char* substring(char*string , int S , int L){ char* sub=malloc((L+1)); if(sub == NULL) return NULL; for(int i=S;i<=L;i++){ *(sub+i-S)=*(string+i-1); if(*(sub+i-S) == 0) return sub; /* L too big */ } *(sub+L)='\0'; return sub; } ... char *sub = substring(argv[i],S,S+X); if(sub) { printf("%s",substring(argv[i],S,S+X)); free(sub); /* wenn sub nicht mehr gebraucht wird */ }
-
Hallo!
@supertux:Das liegt vlt. daran, dass ich hingegen zu dir noch Anfänger bin und mit free noch nie gearbeitet habe. Meine Überlegung was nämlich, dass wenn ich den Speicherplatz für sub davor freigebe ja sub gelöscht und nicht zurückgegeben werden kann. Dann erklär mir mal wie das richtig funktioniert...
Qbig brother:Danke für den Anstoß, ich habe da etwas durcheinandergebracht.Ich habe jetzt also eine Array argv indem jedes Element aus einem Wort besteht, das ich eingegeben habe.Mich würden aber die einzelnen Buchstaben interessieren. Wie kann ich auf diese zugreifen um diese so mit malloc an einem anderen Platz so zu speichern, dass ich pro Arrayelement einen Buchstaben habe?
Gruß
-
Die Buchstaben bekommst du mit argv[i][j]. Der Speicherplatz für die Argumente existiert während des Programms. Du brauchst nicht unbedingt alles zu kopieren, argv und argc speichern genügt.
-
Danke!
So wie sich das anhört könnte ich ja einfach den Namen des Arrays, also argv, der Funktion substring als Pointer übergeben, oder? Da werden doch auch die einzelnen Buchstaben durchlaufen.
Danke für deine Vorschläge supertux, die ich erst jetzt bemerkt habe.
#include <stdlib.h> #include <stdio.h> #include <string.h> char* substring(char*string , int S , int L){ char* sub=(char*)malloc(sizeof(char)*(L+1)); if(sub == NULL) return NULL; for(int i=S;i<=L;i++){ *(sub+i-S)=*(string+i-1); } if(*(sub+i-S) == 0) return sub; /* L too big */ } *(sub+L)='\0'; return sub; } int main(int argc, char *argv[]) { int S=atoi(argv[argc-2]); int L=atoi(argv[argc-1]); printf("%s",substring(argv,S,L)); getchar(); free(sub); return 0; }
-
aperion hast es hin beommen???
studierst auch info in ibk??
ich hätte die lösung
-
Nein, nicht mehr versucht.
Studiere Physik in ibk...
Wäre echt nett wenn du dein Programm mal posten könntest!Danke
Apeiron