Могу ли я эмулировать strcpy с помощью malloc?

#c #c-strings

#c #c-строки

Вопрос:

Я пытаюсь создать функцию strcpy с нуля для класса. Хотя я мог бы сделать это с помощью цикла for и скопировать отдельные символы, я думаю, я мог бы просто сделать обмен, используя 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
 

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

Комментарии:

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

2. все в этом неверно

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

4. Если вам не нужен цикл, вы можете использовать memcpy . Но цикл, вероятно, лучше всего. При memcpy этом вам понадобится длина строки, поэтому добавьте вызов strlen , так что вы экономите?

5. @Johnny Mopp: у него уже есть вызов strlen . Ему просто нужно сохранить значение и использовать его дважды: для malloc и для strcpy .

Ответ №1:

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

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

Короче говоря, while ((*s1 = *s2 )); это ваша самая простая strcpy реализация.

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

Комментарии:

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

2. void totallyNotstrcpy(символ s1[], символ s2[]) {

3. void totallyNotstrcpy(символ s1[], символ s2[]) {

Ответ №2:

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

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

В качестве быстрого вопроса, как работает ваш фрагмент кода? Разве цикл while не нуждается в условии?

Комментарии:

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