2016-03-24 10 views
0

Ich versuche, die Zeichen einer Zeichenfolge in ein dynamisches Array zu kopieren. Hier ist, was ich arbeite mit:String in Array kopieren

void foo(const char * string, char ** final) 
{ 
    unsigned long n = strlen(string); 
    final = (char **)malloc(n+1); 
    for (int i = 0; i < n; ++i) 
    { 
     final[i] = string[i]; // error here 
    } 
} 

Der Build ist fehlgeschlagen und zeigt auf die Zeile markiert "Fehler hier." Mit dem Fehler:

Incompatible integer to pointer conversion assigning to 'char *' from 'const char.' 

Ich denke, das Problem ist, wenn ich das Array erstellt/die Zeiger richtig zu bekommen.

+2

'Ergebnis' ist nicht deklariert. – EOF

+0

Welchen Fehler gibt Ihnen der Compiler? –

+0

Bitte lernen Sie wie ein Programmierer zu denken: Sagen Sie nicht _error here_. Erklären Sie alle Details, die Sie bisher über den Fehler haben. Und dann nach mehr Details suchen. Ich kann sehen, dass Sie einen Kompilierungsfehler haben, aber, gute Trauer; Wie ist _error here_ hilfreich? –

Antwort

3

final Unter der Annahme ist Ihr Ausgangsparameter, werden Sie brauchen dereferenzieren das Ergebnis der malloc zuweisen, dann wieder für die Zuordnung in der Schleife

*final = malloc(n+1); 
for (int i = 0; i < n; ++i) { 
    (*final)[i] = string[i]; 
} 

Auch dies wird vorausgesetzt, Ihre beabsichtigte Verwendung in etwa wie folgt ist

input_str = "some text"; 
char* copy; 
foo(input_str, &copy); 

Obwohl es die Frage aufwirft, warum nicht die API die Kopie zurückgeben?

char* copy = foo(input_str); 
0

Der ursprüngliche Code würde nicht wirklich funktionieren, wenn ein NULL-Handle (Zeiger auf einen Zeiger) als Verweis übergeben wird. Es würde also nicht viel Sinn machen, all das Zuweisungsgeschäft innerhalb von foo() zu tun: Wenn foo() nicht endgültig zurückgibt, ist es außerhalb von foo() nicht verwendbar, es sei denn, bereits initialisiert, IMHO. Dann würde der Handle Sinn machen, foo() nimmt die Adresse der zweiten Zeichenfolge als Argument und muss sie nicht zurückgeben. Lassen Sie uns dieses Beispiel-Code betrachten, basierend auf der ursprünglichen Nachricht (Debug-Drucke enthalten):

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void foo(const char * string, char ** final) 
{ 
(*final) = (char *)malloc(n+1);//we deference the address to reach and size the variable 
printf("From foo: "); 
for (unsigned long i = 0; i < strlen(string); ++i) 
{ 
    (*final)[i] = string[i]; 
    printf("%c",(*final)[i]); 
} 
printf("\n"); 
} 

nehmen wir an, foo() von einer anderen Funktion in der folgenden Art und Weise aufgerufen wird, der Einfachheit halber:

int main(int argc, const char * argv[]) 
{ 
char *fin; 
char *str = "string"; 
foo(str, &fin);  
printf("From main: "); 
for(unsigned long j = 0; j < strlen(fin); j++) 
    printf("%c", fin[j]); 
printf("\n"); 
return 0; 
} 

Es würde funktionieren, aber wofür? Es gibt einfachere Mittel, um das gleiche Ergebnis zu erreichen, IMHO. Hoffe, das kann helfen.