Как вернуть всю строку, используя только указатели

97
8

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

 char *ft_strcpy(char *dest, char *src)
{
while (*src)
{
*dest = *src;
dest++;
src++;
// return dest; i want
}
*dest = '\0';
return (dest);
}

спросил(а) 2021-01-19T12:08:52+03:00 2 месяца, 3 недели назад
1
Решение
75

Вы теряете свою строку при увеличении dest. В конце dest указывает на местоположение, которое содержит '\0'. Вы можете использовать временную переменную для изменения, в то время как dest все еще указывает на начало выделенной памяти.

char *temp = dest;
while (*src)
{
*temp = *src;
temp++;
src++;
}
*temp = '\0';
return (dest);

ответил(а) 2021-01-19T12:08:52+03:00 2 месяца, 3 недели назад
44

Также, как и другие, о возврате оригинального dest как dest ниже,

char *ft_strcpy(char *dest, char *src) {
char *original_dest = dest; // add
while (*src) {
*dest++ = *src++;
}
*dest = '\0';
// return dest;
return original_dest;
}

Интересно подумать о воздействии перекрывающихся строк. В приведенном ниже ft_strcpy() будет циклически ft_strcpy() до тех пор, пока код не получит доступ к внешнему buf[] приведет к неопределенному поведению, а не к надежде на "hehello". Тогда while (*src) { loop, в этом случае, написал нулевой символ.

char buf[10] = "hello";
ft_strcpy(buf + 2, buf);

Такие вызовы, как указано выше, являются патологическими, но все же разрешены.

Стандартный strcpy() запрещает этот тип вызова с restrict. Упрощенно это означает, что s1,s2 не должны перекрываться.

char *strcpy(char * restrict s1, const char * restrict s2); 

Как написать код для обработки перекрывающихся строк?

Определите длину перед копированием.
Скопируйте с memmove() который обрабатывает перекрывающиеся буферы.

char *ft_strcpy2(char *dest, const char *src) {
size_t sz = strlen(src) + 1;
memmove(dest, src, sz);
return dest;
}

int main(void) {
char buf[10] = "hello";
puts(ft_strcpy2(buf + 2, buf));
puts(buf);
}

Выход

hello
hehello

ответил(а) 2021-01-19T12:08:52+03:00 2 месяца, 3 недели назад
44

Вы пропустите основные принципы C использования указателя. Когда вы используете dest++; вы переместите указатель на следующий байт. Если вы вернете последнее значение dest, вы сначала получите указатель на конец строки. Другой - вам не нужно возвращать указатель, все операции с указателем изменяют данные в базовую строку, используемую как параметр dest в вашем примере. Поэтому, когда вы закончите функцию, вы можете получить указатель, используемый в качестве параметра dest в родительской функции, и увидите, что ваши изменения завершены.

Если вы все еще хотите построить некоторую конструкцию функции с указателем возврата, выполните следующие действия:

char *ft_strcpy(char *dest, char *src)
{
char * retValue = dest;
while (*src)
{
*dest = *src;
dest++;
src++;
// return dest; i want
}
*dest = '\0';
return (retValue);
}

Чем вы можете получить указатель на первый байт в строке в качестве возвращаемого значения.

ответил(а) 2021-01-19T12:08:52+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема