5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
1

Функция strcpy

01.05.2012, 08:25. Показов 11461. Ответов 13
Метки нет (Все метки)

Почему-то разработчиками была создана функция не типа void а
сhar * strcpy(char *dest, char *src)
где функция "возвращает ссылку на строку результата"
Тем не менее я в инете не нашел примеров ее использования скажем так
C
1
2
 сhar *p;char s2[6]="abcd",s1[6];
 p=strcpy(s1,s2);
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.05.2012, 08:25
Ответы с готовыми решениями:

Ошибка с strcpy
В данном коде в функции findNearEquals вылетает ошибка доступа к памяти, помогите найти её Вот...

ошибка в strcpy
я переводил программу с другого языка программирования на С-язык. Там была функция substr. substr...

Не работает strcpy()
Нужно вывести строку "Hello, World!" из строки "pt Hello, World!;": #include <stdio.h> #include...

Strcpy обход дерева
void write_tree_to_file(node_id* tree_id, FILE* fp) { if (tree_id) { char line; ...

13
Злой няш
2006 / 1427 / 524
Регистрация: 05.04.2010
Сообщений: 2,698
01.05.2012, 09:27 2
Цитата Сообщение от eugrita Посмотреть сообщение
где функция "возвращает ссылку на строку результата"
Если описать функцию так:
C
1
char *strcpy (char *dst, const char *src);
где dst — указатель на буфер назначения, src — указатель на исходную строку, то функция возвращает значение dst.

Цитата Сообщение от eugrita Посмотреть сообщение
была создана функция не типа void
Видать разработчики посчитали так нужным для специфических задач, в большинстве же случаев запись вида:
C
1
p=strcpy(s1,s2);
не используется. Почему это вас так задевает?
0
52 / 52 / 2
Регистрация: 09.03.2012
Сообщений: 101
01.05.2012, 10:41 3
Возвращается указатель на целевую строку для вложенных вызовов функций. Я бы так не советовал делать, но вот пример:
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <string.h>
 
void func()
{
    const char* a="Hello";
    char b[100];
    printf("%s",strcat( strcpy(b,a), ", world!" ));
}
Не сразу понятно, как такой код работает, повышается вероятность ошибок, проблем с памятью и т.д.
1
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
01.05.2012, 11:57 4
Цитата Сообщение от eugrita Посмотреть сообщение
Почему-то разработчиками была создана функция не типа void а
Цитата Сообщение от eugrita Посмотреть сообщение
Тем не менее я в инете не нашел примеров ее использования скажем так
Допустим, задание, скопировать из строки src, в dst, и вывести результат(т.е. строку dst)
C
1
2
3
4
char src[] = "QWERTY";
char dst[BUFSIZ] = {'\0'};
 
printf("%s\n", strcpy(dst, src));
Решили в одну строку, в вашем случаи потребовалось бы две строки кода. Оптимизация!!!
0
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
01.05.2012, 12:03 5
Цитата Сообщение от go Посмотреть сообщение
Решили в одну строку, в вашем случаи потребовалось бы две строки кода. Оптимизация!!!
оптимизация - это когда программа быстрее работает, а не когда запутывает поддерживающего код
0
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
01.05.2012, 14:00 6
Цитата Сообщение от alex_x_x Посмотреть сообщение
оптимизация - это когда программа быстрее работает, а не когда запутывает поддерживающего код
Количество строчек, это вполне хорошая оптимизация алгоритма. Разные есть смысла. Я думал, что Вы знаете.
0
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
01.05.2012, 15:44 7
Цитата Сообщение от go Посмотреть сообщение
Количество строчек, это вполне хорошая оптимизация алгоритма. Разные есть смысла. Я думал, что Вы знаете.
лет 40 назад - да, оптимизация для транслятора, а сейчас какой смысл? метрики какие-нибудь разве
0
Заблокирован
Автор FAQ
02.05.2012, 00:46 8
Цитата Сообщение от eugrita Посмотреть сообщение
Почему-то разработчиками была создана функция не типа void а
сhar * strcpy(char *dest, char *src)
где функция "возвращает ссылку на строку результата"
Тем не менее я в инете не нашел примеров ее использования скажем так
- и кто запрещает использовать, люди на форуме, да?
Всё можно использовать, лишь бы не забывать о размерах строк приёмника и источника, смотри
Цитата Сообщение от eugrita Посмотреть сообщение
strcpy(s1,s2);
- скопирует s1 в s2 а возвратом функции будет являться указатель на строку s1, твой р - указатель, и такой записью
Цитата Сообщение от eugrita Посмотреть сообщение
p=strcpy(s1,s2);
- ты его инициализируешь, аналогичный функционал можно было бы получить выполнив следующее : p = s1;
Запусти этот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int main()
{
    char *p;
    char s2[6]="abcd";
    char s1[6];
    p = strcpy(s1,s2);
    cout<<"s1 = "<<s1<<" adr = "<<hex<<&s1<<endl;
    cout<<"s2 = "<<s2<<" adr = "<<hex<<&s2<<endl;
    cout<<"p  = "<<p <<" adr = "<<hex<<&p<<endl;
    system("pause");
    return 0;
}
http://codepad.org/XjCizFoh
Миниатюры
Функция strcpy  
1
Evg
Эксперт CАвтор FAQ
21204 / 8220 / 633
Регистрация: 30.03.2009
Сообщений: 22,542
Записей в блоге: 30
02.05.2012, 00:50 9
Цитата Сообщение от go Посмотреть сообщение
Количество строчек, это вполне хорошая оптимизация алгоритма. Разные есть смысла
Вот начитаются начинающие подобных высказываний, поймут в буквальном смысле и ведь действительно начнут думать, что чем короче программа, тем быстрее она работает
0
1 / 1 / 1
Регистрация: 23.10.2009
Сообщений: 17
07.09.2015, 06:44 10
Объясните мне пожалуйста почему в строчке

C
1
while(*dst++=*src++);
не происходит бесконечного увеличения указателей dst и src..По мне так они должны увеличиваться, ведь в С ничего не следит за соблюдением границ массива, разве нет?

Вот метод
C
1
2
3
4
5
6
7
char *mystrcpy(char *dst, const char *src)
{
char *ptr;
ptr = dst;
while(*dst++=*src++);
return(ptr);
}
0
2624 / 2209 / 237
Регистрация: 03.07.2012
Сообщений: 7,988
Записей в блоге: 1
07.09.2015, 06:54 11
В C (и C++) строка заканчивается нулевый байтом, так что предполагается, что программист выделил для массивов достаточный объем памяти.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11047 / 6994 / 1656
Регистрация: 25.07.2009
Сообщений: 12,764
07.09.2015, 07:57 12
KOsTTTT, результатом выражения (*dst++ = *src++) будет значение скопированного символа. Когда цикл дойдёт до '\0' в src, он скопируется в dst и вернётся в качестве результата, на чём цикл while и завершится.
1
Evg
Эксперт CАвтор FAQ
21204 / 8220 / 633
Регистрация: 30.03.2009
Сообщений: 22,542
Записей в блоге: 30
07.09.2015, 10:06 13
Цитата Сообщение от KOsTTTT Посмотреть сообщение
Объясните мне пожалуйста почему в строчке
C
while(*dst++=*src++);
не происходит бесконечного увеличения указателей dst и src..По мне так они должны увеличиваться, ведь в С ничего не следит за соблюдением границ массива, разве нет?
В языке Си операция присваивания является в том числе и выражением, возвращающее значение левой части. Т.е. операцию присваивания можно использовать в тех местах, где ожидается значение. Типа того, что операция

C
a = b + (c = d);
эквивалентно

C
a = b + (c = d, c);
что по смыслу имеет такой же порядок вычисления, как и

C
c = d;
a = b + c;
А код

C
while (a = b)
эквивалентен

C
while ( (a=b), a != 0 )
т.е. сначала сделать присваивание, а потом результат присваивания проверить на не ноль. Тут появляется преобразование "целое -> логическое" (подробнее см. Непонятный оператор из книги K&R)

В твоём случае аналог будет такой

C
while(*dst++=*src++)
{
  ...
}
эквивалентно

C
while( (*dst++=*src++), tmp != 0 ) /* где tmp - это то, что было в операции присваивания (до инкрементации src и dst) */
{
  ...
}
эквивалентно

C
L1:
  /* условие внутри while, которое вырабатывает некий результат tmp */
  *dst = *src;
  tmp = *dst;
  src++;
  dst++;
 
  /* вот так раскрывается while (tmp != 0) */
  if (tmp != 0)
    goto L2;
  else
    goto L3;
 
L2:
  {
    ...
  }
  goto L1;
L3:
2
1 / 1 / 1
Регистрация: 23.10.2009
Сообщений: 17
07.09.2015, 17:29 14
А, я понял,
C
1
while(*dst++=*src++)
же будет выполняться пока *dst не равен нулю, а в любая строка заканчивается нулем...Спасибо за ответы
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.09.2015, 17:29

Падает программа с strcpy
Не могу понять, почему вылетает программа. Через malloc память для *p выделять пробовал, все равно...

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

Не компилируется программа. Предположительно - нужно использовать strcpy
Добрый день, имеется программа, но никак не могу откомпилировать, начинается ругаться, ругается на ...

Линейный список и ошибка Warning: passing arg 1 of `strcpy' from incompatible pointer type
Проблема с написанием проги (линейный список). Язык Си. #include &lt;stdio.h&gt; #include &lt;string.h&gt;...


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

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

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