2016-03-24 2 views
0

Я пытаюсь скопировать символы строки в динамический массив. Вот то, с чем я работаю:Копировать строку в массив

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 
    } 
} 

Строка не работает и указывает на строку с пометкой «error here». С ошибкой:

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

Я думаю, проблема в том, что я создал массив/получив правильные указатели.

+2

'результат' не объявлен. – EOF

+0

Какая ошибка дает вам компилятор? –

+0

Пожалуйста, научитесь думать как программист: Не говорите _error здесь_. Объясните все детали, которые вы имеете до сих пор об ошибке. И затем ищите более подробную информацию. Я вижу, что у вас есть ошибка компиляции, но, хорошее горе; как здесь работает _error? –

ответ

3

Предполагая final ваш выходной параметр, вы будете должны разыменованиями его присвоить результат таНоса, затем снова для назначения в петле

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

Опять же это если ваше предполагаемое использование является то вроде следующего

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

Хотя он задает вопрос, почему бы не заставить api вернуть копию?

char* copy = foo(input_str); 
0

Исходный код не работает, если дескриптор NULL (указатель на указатель) передается по ссылке. Таким образом, было бы нецелесообразно выполнять все операции распределения внутри foo(): если foo() не возвращает final, он не может использоваться вне foo(), если уже не инициализирован, IMHO. Тогда дескриптор будет иметь смысл, foo() берет адрес второй строки в качестве аргумента и не должен возвращать ее. Давайте рассмотрим этот пример кода, основанный на исходное сообщение (отладочные печать в комплекте): Предположим, что Foo

#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"); 
} 

Обратим() вызывается из другой функции следующим образом, для простоты:

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; 
} 

Это сработало бы, но зачем? Есть более простые средства для достижения того же результата, ИМХО. Надеюсь, это поможет.

Смежные вопросы