#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) .