Необходимо понять, как char * strcpy (char * cad1, const char * cad2) работает в C - PullRequest
0 голосов
/ 19 ноября 2018

Не могу понять, как метод с этой головой: char * strcpy (char *cad1, const char *cad2), работает в C в этом примере:

'char * strcpy (char *cad1, const char *cad2){
        char *aux = cad1;
        for( ; *cad1++ = *cad2++; );
        return cad1;
 }'

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018
char * strcpy (char *cad1, const char *cad2){

for( ; *cad1++ = *cad2++;); 
return cad1; 
}

способ, которым это работает, на вызывающей стороне, он может быть использован двумя способами, но всегда требует буфера для записи, поэтому использование является одинаковым.

 char arr[255];
 memset(arr,0,sizeof(char) * 255); // clear the garbage initialized array;
 strcpy(arr, "this is the text to copy that is 254 characters long or shorter.");
 puts(arr);

или

 char arr[255];
 memset(arr,0,sizeof(char) * 255);
 puts(strcpy(arr,"hello C!"));

чувствую, что функция возвращает указатель на буфер, который также работает.

0 голосов
/ 20 ноября 2018

Начиная с сигнатуры метода или его прототипа, он многое говорит о том, как он работает: у нас есть два параметра вместе с их соответствующими типами и типом возвращаемого значения.Все параметры в этом случае являются указателями на символ, более известный как указатель на символ.Эти символьные указатели - это то, что используется в «C» как строки символов.Один параметр является константным, потому что это значение не должно быть изменено в функции, оно ДОЛЖНО сохранять исходное значение.Строки в «C» имеют некоторые особенности: после создания указателя на строку он всегда указывает на первые символы в строке или индексе 0, так же, как char * v = var [0], и его можно увеличивать, передавая вследующий символ в строке, такой как v ++.Другая особенность в "C" заключается в том, что все строки, представленные массивами символов, заканчиваются символом 0 (ASCII null = 0).

Версия strcpy учитывает эти концепции и создает цикл for для копирования каждого элемента вchar * cad2 - * cad1, переменные ДОЛЖНЫ быть размещены статически или динамически (malloc) перед вызовом функции, а возвращение функции в приведенном выше коде является указателем на исходную переменную (в этом случае * cad1, обычно они возвращаютскопированный).В вашей функции она была изменена, я имею в виду, что она возвращает оригинал вместо скопированного, что выглядит неправильно, поскольку вы ловите в aux указатель на первый элемент скопированной переменной, а вы его не использовали.

Хорошим моментом для наблюдения является цикл for:

for( ; *cad1++ = *cad2++; );

Как это работает, хитро, первый интересный момент заключается в том, что цикл for имеет параметры дерева, а в "C" все они необязательны.Первый - инициализация, второй - логическое условие продолжения итерации, а последний - увеличение или уменьшение.Далее, хитро ли является * cad1 ++ = * cad2 ++ логическим выражением?Ответ - да, это так.Так как в «С» значение 0 (ноль) является ложным, а все остальное является истинным.Помните, что я сказал, что строки в «C» всегда заканчиваются 0 (ноль), поэтому при оценке и присвоении копии значение указателя (использование * cad1 вернет значение, указанное переменной указателя, звездочка вbegin делает эту магию) и достигает конца строки, которая вернет false и завершит цикл итерации.Здесь интересен один момент: во-первых, в этом случае оценка имеет меньший приоритет, чем присваивание, в результате чего сначала копируется значение в переменную копирования, а затем вычисляется логическое выражение.

«C» - это как выпишет небольшой код, который имеет большое значениеЯ надеюсь, что вы поняли объяснение.Для получения дополнительной информации смотрите указатели "C" по адресу: https://www.tutorialspoint.com/cprogramming/c_pointers.htm.

...