char pointer swappen
-
probier so:
#define SWAP(a,b) {void *t=a;a=b;b=t;} int main() { char *a = "hallo"; char *b = "doof"; printf ("%p %p\n", a, b); SWAP (a,b); printf ("%p %p\n", a, b); }
-
jo ok, vielen dank euch beiden, ich glaub ich habs jetzt
PS: das mit dem free(str) kommt dann schon noch in main().
-
habs nochmal überarbeitet aber leider klappts immer noch nicht. hier nochmal die überarbeitete version von void reverse(), diesmal mit zeiger auf zeiger. ich hoffe es findet jemand den fehler weil ich komm einfach nicht drauf.
void reverse(char **str) { int len=strlen(*str); char *tmp=(char*) malloc(len+1); if(NULL==tmp) exit(1); int i; for(i=0; i<len; ++i) tmp[i]=*(str[len-i-1]); tmp[i]=0; swap(str, &tmp); free(tmp); };
-
willst du einfach nur einen string umdrehen?
das ist doch viel zu kompliziert so (mit malloc und swap)
-
#include <stdio.h> #include <stdlib.h> #include <string.h> void swap(char **a, char **b) { char *tmp=*a; *a=*b; *b=tmp; } void reverse(char **str) { int len=strlen(*str); char *tmp=(char*) malloc(len+1); if(NULL==tmp) exit(1); int i; for(i=0; i<len; ++i) tmp[i]=(*str)[len-i-1]; // << tmp[i]=0; swap(str, &tmp); free(tmp); } int main() { char* abc = new char[4]; strcpy(abc,"abc"); reverse(&abc); return 0; }
Compiliert ohne Fehler und macht was es soll.
mfg
-
gerie schrieb:
Compiliert ohne Fehler...
das ist gelogen.
ich bin zwar kein c-compiler, aber nur beim angucken sehe ich schon mindestens 2 fehler...
-
muss natürlich
char* abc = malloc (4);
heissen, wir sind ja hier im C-Forum!
-
gerie schrieb:
void reverse(char **str) { int len=strlen(*str); char *tmp=(char*) malloc(len+1); // type cast ist unnötig if(NULL==tmp) exit(1); // besser: return int i; // muss nach oben, sonst error for(i=0; i<len; ++i) tmp[i]=(*str)[len-i-1]; tmp[i]=0; swap(str, &tmp); // ein einfaches 'free(*str); *str=tmp;'... free(tmp); // ...tut's auch. brauchst kein swap }
-
ok so klappst endlich
, was mich aber noch interessieren würde:
@ten: warum gibt das int i; einen error und was wäre denn die viel einfachere lösung?
-
c-newb schrieb:
@ten: warum gibt das int i; einen error
man kann nicht einfach variablen mitten im code anlegen. höchstens in einem neuen anweisungsblock {...}.
c-newb schrieb:
und was wäre denn die viel einfachere lösung?
z.b. sowas:
// 'out' muss auf ein array zeigen, das mindestens so gross ist strlen(in)+1 void reverse (char *in, char *out) { size_t l = strlen(in); out[l] = 0; while (*in) out[--l] = *in++; } // dreht und kopiert den string zurück // geht natürlich nicht mit stringliteralen ;) void reverse_source (char *in) { char *p = malloc (strlen(in)+1); if (p) { reverse (in, p); strcpy (in, p); free (p); } }
-
oder einfach ohne temporaer-string.
-
ten schrieb:
c-newb schrieb:
@ten: warum gibt das int i; einen error
man kann nicht einfach variablen mitten im code anlegen. höchstens in einem neuen anweisungsblock {...}.
naja, seit C99 stimmt das nicht mehr...
Greetz, Swordfish