2016-10-15 2 views
1

Я пытаюсь сделать функцию strcpy с нуля для класса. Хотя я мог бы сделать это с циклом for и скопировать отдельные символы, я думаю, что я мог бы просто сделать своп, используя malloc и указатели, чтобы сделать его более эффективным. Вот мой код, но я получаю много запутанных ошибок.Можно ли эмулировать strcpy с помощью malloc?

void notStrcpy(char s1[], char s2[]) { //copies string s1 into s2 
char *s3 = (char *) malloc(strlen(s1)); //s3 is now an alias of s1 
s2 = *s3;} //dereference s3 to dump s1 into s2 

Почему это происходит, и есть ли способ сделать этот код таким, каким я его намеревался?

+5

Нет, абсолютно не нравится. Вы не можете скопировать строку с оператором присваивания. В этом весь смысл 'strcpy'. Если для оператора присваивания поддерживается копирование строк, не будет необходимости в 'strcpy'. – kaylum

+1

все об этом не так –

+0

«Я получаю много запутанных ошибок» - смущает вас? Представьте, что это от * нашего * конца, поскольку мы даже не можем видеть ошибки, которые вас путают, поскольку вы решили не делиться ими в своем вопросе. Независимо от того, что вы пытаетесь сделать, это бесплодная работа, и некоторые дополнительные исследования того, как используются указатели на C, должны быть подняты в повестке дня ваших исследований. – WhozCraig

ответ

2

Вы не можете этого сделать: strcpy ожидает, что оба куска памяти будут готовы - один для чтения строки, а другой для записи строки. Ожидается, что на обоих адресах будет достаточно памяти для фактического содержимого строки C с нулевым завершением.

С другой стороны, malloc дает вам третий кусок памяти (вам нужно выделить strlen(s)+1, но это совсем другая история). Алгоритм копирования строк не используется для этой части памяти. Кроме того, назначение параметров функции не влияет на значения, переданные в вашу функцию, поэтому s2 = *s3 не делает то, что, по вашему мнению, должно делать.

Краткая история, while ((*s1++ = *s2++)); - ваш самый простой вариант strcpy.

Примечание:malloc может пригодиться в реализации струна дублирования функции, например, strdup. Если вы решите попробовать, не забудьте выделить место для нулевого терминатора.

+0

Спасибо. Моя новая функция выглядит следующим образом: –

+0

void полностьюNotstrcpy (char s1 [], char s2 []) { –

+0

void полностьюNotstrcpy (char s1 [], char s2 []) { –

0

@dasblinkenlight спасибо. Мой новый код выглядит следующим образом:

void totallyNotstrcpy(char s1[], char s2[]) { 
int x = 0; 
while (x < strlen(s1)+1) { 
    s2[x] = s1[x]; 
    x++; 
} 
} 

Как быстрый побочный вопрос, как работает ваш фрагмент кода? Не требуется ли в цикле while условие?

+0

Это ужасно. 'strlen()' равно O (n), поэтому ваш 'strcpy' равен O (n^2).Вам не нужно знать длину строки. Вам просто нужно скопировать символы, пока вы не достигнете (и не скопировали) терминатора NUL, который является O (n). – pat

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