1 / 1 / 0
Регистрация: 10.03.2017
Сообщений: 28
1

Реализовать поведение функции strcpy

20.02.2021, 15:19. Показов 2146. Ответов 8
Метки нет (Все метки)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <string.h>
 
char *ft_strcpy(char *dest, char *src);
 
int main()
{
    char D[5];
    char S[9] = "123456789";
    char *dest = D;
    char *src = S;
 
    //ft_strcpy(dest, src);
    strcpy(dest, src);
    printf("%s\n", dest);
}
 
char    *ft_strcpy(char *dest, char *src)
{
    int i;
 
    i = 0;
    while (src[i] != '\0')
    {
        dest[i] = src[i];
        i++;
    }
    dest[i] = '\0';
    return (dest);
}
Мне необходимо реализовать поведение функции strcpy. Вот код, который получился, но когда записываемый массив меньше массива донора оригинальная функция выдает ошибку, а моя просто увеличивает размер записываемого массива и добавляет в конец 1 символ, всегда разный (при данных в коде значениях массив D становиться 9 символов из S и +1 рандомный) . Что не так?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2021, 15:19
Ответы с готовыми решениями:

Релизация функции strcpy
Здравствуйте. Я попытался реализовать функцию strcpy, но она возвращает огромное отрицательное...

Нужен рекурсивный аналог функции strcpy
Мне надо сделать аналогию функции strcpy рекурсией. int strcpy_r(char* s1,char* s2) { ......

Объяснить неожиданное поведение программы при использовании массивов и функции strcpy()
Посмотрел в отладчике,получается,что конструктор берет переменную l,вместо k и записывает ее в sym...

Реализовать собственные функции strcat, strcpy, strcmp, strlen
Добрый день. Помогите с задачей. Необходимо реализовать собственные функции strcat, strcpy,...

8
из племени тумба-юбма
2188 / 1567 / 348
Регистрация: 29.11.2015
Сообщений: 7,349
Записей в блоге: 13
20.02.2021, 15:47 2
Цитата Сообщение от 1-d_x_d-1 Посмотреть сообщение
но когда записываемый массив меньше массива донора оригинальная функция выдает ошибку
В описании функции strcpy четко сказано
Если строки перекрываются, результат копирования будет не определен
то есть, массивы должны быть строго одного размера.

Добавлено через 2 минуты
Если хотите работать со строками разного размера, используйте другие функции языка.
0
1 / 1 / 0
Регистрация: 10.03.2017
Сообщений: 28
20.02.2021, 16:34  [ТС] 3
Дело в том что у меня задание в котором нужно повторить в точности поведение. Значит и ответы моей функции и оригинальной должны совпадать, а это не так
0
964 / 707 / 229
Регистрация: 30.06.2015
Сообщений: 3,784
Записей в блоге: 37
20.02.2021, 16:54 4
Лучший ответ Сообщение было отмечено 1-d_x_d-1 как решение

Решение

Цитата Сообщение от 1-d_x_d-1 Посмотреть сообщение
Вот код, который получился, но когда записываемый массив меньше массива донора оригинальная функция выдает ошибку,
Ничего оригинальная функция не выдает. Она успешно пишет в невыделенную память без предупреждений. Проверял и в lcc и в gcc.
0
Эксперт С++
2785 / 1605 / 829
Регистрация: 14.12.2018
Сообщений: 3,193
Записей в блоге: 1
20.02.2021, 17:22 5
Цитата Сообщение от 1-d_x_d-1 Посмотреть сообщение
char S[9] = "123456789";
По-моему это возникло ошибку ! Вы выделяли 9 байтов для строки S, но вы задаете строку с 10 символов из "123456789". Это не правильно ! Проверьте....
0
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
20.02.2021, 17:43 6
Цитата Сообщение от мама Стифлера Посмотреть сообщение
В описании функции strcpy четко сказано
Если строки перекрываются, результат копирования будет не определен
то есть, массивы должны быть строго одного размера.
Original: The strings may not overlap...
Это значит что если вы копируете часть строки в ту же строку (но, к примеру, в другую её часть), то результат функции неопределён. В таких случаях используется функции memmove/wmemmove. Примеры:
C
1
2
3
char s[] = "it is a string";
strcpy( &s[ 0 ], &s[ 0 ] + 1 ); // undefined behavior
memmove( &s[ 0 ], &s[ 0 ] + 1, 5 ); // ok
Цитата Сообщение от 1-d_x_d-1 Посмотреть сообщение
но когда записываемый массив меньше массива донора оригинальная функция выдает ошибку
Это неправда. Ваша ошибка генерируется во время выполнения операционной системой, но не стандартной функцией strcpy. Так что не переживайте, всё с вашей реализацией в порядке. Сравните с оригиналом:
C
1
2
3
4
5
6
7
8
9
char *
strcpy(char * __restrict to, const char * __restrict from)
{
  char *save = to;
 
  for (; (*to = *from); ++from, ++to)
    ;
  return(save);
}
2
из племени тумба-юбма
2188 / 1567 / 348
Регистрация: 29.11.2015
Сообщений: 7,349
Записей в блоге: 13
20.02.2021, 18:03 7
Цитата Сообщение от 1-d_x_d-1 Посмотреть сообщение
Дело в том что у меня задание в котором нужно повторить в точности поведение. Значит и ответы моей функции и оригинальной должны совпадать, а это не так
У вас вообще ошибка в коде, сначала вы создаете массив
C
1
char S[9] = "123456789";
А потом пытаетесь искать конец строки
C
1
while (src[i] != '\0')
Вот так будет правильно
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <string.h>
 
void ft_strcpy(char *dest, char *src)
{
    int i = 0;
    while (src[i] != '\0')
    {
        dest[i] = src[i];
        i++;
    }
    dest[i] = '\0';
}
 
int main()
{
    char D[5]="";
    char S[] = "123456789";
    char *dest = D;
    char *src = S;
 
    strcpy(dest, src);
    printf("%s\n", dest);
 
    ft_strcpy(dest, src);
    printf("%s\n", dest);
return 0;
}

Только как я и написал выше - Если строки перекрываются(не равны), результат копирования будет не определен

Добавлено через 12 минут
Цитата Сообщение от zeroalef Посмотреть сообщение
Это значит что если вы копируете часть строки в ту же строку
А при чем здесь часть строки, если функция strcpy копирует строку целиком? Она не копирует по частям.
1
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
20.02.2021, 18:13 8
Цитата Сообщение от мама Стифлера Посмотреть сообщение
А при чем здесь часть строки, если функция strcpy копирует строку целиком?
Например, исходная строка "12345678", копируем с позиции 4 в позицию 2. Ожидаемый результат "125678", но стандарт не гарантирует нам корректного выполнения этой задачи функциями strcpy/memcpy, однако гарантирует что функция memmove выполнит это несмотря на то что исходная строка и строка назначения есть одна и та же область памяти.

Добавлено через 2 минуты
Вот что значит "The memory areas may overlap..."/"The memory areas may not overlap..."
0
С чаем беда...
Эксперт CЭксперт С++
9267 / 4765 / 1290
Регистрация: 18.10.2014
Сообщений: 10,867
20.02.2021, 23:28 9
Цитата Сообщение от 1-d_x_d-1 Посмотреть сообщение
оригинальная функция выдает ошибку
Стандартная функция strcpy работает со строками. char S[9] = "123456789"; - это не строка. Поведение не определено.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2021, 23:28

Аналог функции strcpy
myStrlen был дан как пример в книге, а свой myStrcpy неполучается написать:pardon: int...

Указатель и strcpy в функции
Добрый вечер. Подскажите пожалуйста почему strcpy ругается на sent? Хоть как указатель пиши, хоть...

Чем отличаются функции strcpy и strcpy_s
Подскажите в чем отличаются функции: strcpy от strcpy_s, sprintf от sprintf_s, strcat от ...

Объясните цикл в реализации функции strcpy
На форуме нашел реализацию функции strcpy: char * strcpy(char * dst, const char * src){ char *...

Не работает функция gets(), strcpy() и другие функции с строками
Подключеные библиотеки все. MVS 2013. #include &lt;iostream&gt; #include &lt;cstring&gt; #include...

Ошибка компиляции при вызове функции strcpy
Подскажите пожалуйста чего он ругается


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.