Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 55, средняя оценка - 4.87
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
#1

Функция strcpy - C++

03.04.2011, 08:22. Просмотров 7802. Ответов 27
Метки нет (Все метки)

цель очевидна. почему не работает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
void strcpy(char *from, char *to) {
        to=from;
}
int main()
{
    char* f = "The array of chars";
    char* t = "An Array of chars!";
    strcpy(f,t);
    std::cout<<t;
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2011, 08:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция strcpy (C++):

функция strcpy и strcat - C++
Добрый день!У меня такая проблема...Есть массив строк, где хранятся имена и при выводе имени на экран,если оно длиннее определенного,то я...

Массивы строк и функция strcpy - C++
#include&lt;iostream&gt; #include&lt;cstring&gt; #include&lt;cctype&gt; using namespace std; int mystrcpy( char *stl ,char *str); int...

Что делает функция strcpy(t, f) - C++
Функция strcpy(t, f) что она делает?

Функция strcpy() не копирует строку - C++
Функция strcpy() не копирует строку //--------------------------------------------------------------------------- #pragma hdrstop ...

Функция strcpy () - строка должна быть пустой? - C++
Здравствуйте! Возник вопрос: пусть имеются две непустые строки s1 и s2. Правильно ли копировать содержимое строки s2 в строку s1? Или...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dampir_sanek
150 / 148 / 21
Регистрация: 09.02.2010
Сообщений: 407
03.04.2011, 08:43 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
char* strcpy(char *from, char *to) {
        to = from;
        return to;
}
int main()
{
    char* f = "The array of chars";  
    char* t = "An Array of chars!";
    char* result[100];  // можно и без result обойтись, вот так t = strcpy(f, t);
    result =  strcpy(f,t);
    std::cout << result;
    return 0;
}
Пробуйте так.
0
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
03.04.2011, 08:54  [ТС] #3
dampir_sanek, нужно что бы функция была void а все манипуляции со строками проводились бы в теле фунуции, но не в main-e.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
03.04.2011, 09:24 #4
nikkka, таким образом в теле функции можно менять строки, но не указатели, т.к. указатели передаются по значению (т.е. копируются в стек), и все изменения указателей в ф-ции не касаются указателей в main(). Что бы реализовать то, что ты хочешь, нужно сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
void strcpy(char **from, char **to) {
        *to=*from;
}
int main()
{
    char* f = "The array of chars";
    char* t = "An Array of chars!";
    strcpy(&f,&t);
    std::cout<<t;
    return 0;
}
1
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
03.04.2011, 09:28 #5
Или так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
void strcpy(char *& from, char *& to) {
        to = from;
}
int main()
{
    char* f = "The array of chars";
    char* t = "An Array of chars!";
    strcpy(f,t);
    std::cout<<t;
    return 0;
}
1
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
03.04.2011, 09:31 #6
Цитата Сообщение от nikkka Посмотреть сообщение
dampir_sanek, нужно что бы функция была void а все манипуляции со строками проводились бы в теле фунуции, но не в main-e.
Писать свои реализации std не в учебных целях не есть гуд. strcpy() из string сделало бы всё гораздо лучше. ну это имхо.

касательно вашего вопроса:
C++
1
void strcpy(char* &from, char* &to);
0
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
03.04.2011, 09:43  [ТС] #7
Писать свои реализации std не в учебных целях не есть гуд. strcpy() из string сделало бы всё гораздо лучше. ну это имхо.
ну не знаюю, это из страуструпа
0
Subgrando
40 / 40 / 3
Регистрация: 28.01.2011
Сообщений: 175
03.04.2011, 10:50 #8
Почему не так?

C++
1
2
3
4
char* strcpy(char* dest, char* src) {
    while(*dest++ = *src++);
    return dest;
}
0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
03.04.2011, 12:55 #9
Цитата Сообщение от Subgrando Посмотреть сообщение
return dest;
Вернёт указатель на байт, следующий за нулевым в строке.
C
1
2
3
4
5
6
char * strcpy(char * dst, const char * src){
   char * ptr = dst;
   while ( *dst++ = *src++ )
     ;
   return ptr;
}
0
Evg
Эксперт CАвтор FAQ
17826 / 6036 / 388
Регистрация: 30.03.2009
Сообщений: 16,566
Записей в блоге: 26
03.04.2011, 13:01 #10
nikkka, правильный код копирования приведён в постах 8 и 9. А твой код копирует указатель на данные (а не сами данные)

Добавлено через 1 минуту
Кстати, по поводу постов 8 и 9. В таких случаях на современных компиляторах с большой вероятностью выскочит предупреждение из разряда "а может имелось в виду сравнение вместо присваивания". Чтобы этого не происходило, надо сделать дополнительное экранирование круглыми скобками

C
1
while ((*dst++ = *src++))
0
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
03.04.2011, 13:05 #11
Я думаю причина в том что:
C++
1
char* t = "An Array of chars!";
указатель указывает на область памяти, в которую нельзя писать.
нужно объявлять как массив символов.
0
Evg
Эксперт CАвтор FAQ
17826 / 6036 / 388
Регистрация: 30.03.2009
Сообщений: 16,566
Записей в блоге: 26
03.04.2011, 13:12 #12
Цитата Сообщение от nxnx Посмотреть сообщение
Я думаю причина в том что:
C++
1
char* t = "An Array of chars!";
указатель указывает на область памяти, в которую нельзя писать.
нужно объявлять как массив символов.
Нет, причина не в этом. Истинная причина описана в моём посте выше. А вот по твоей причине код будет ломаться на исполнении после того, как функцию strcpy переписать правильно
0
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
03.04.2011, 13:16 #13
ой не заметил.. ну ктож знал что автор ещё и strcpy будет переписывать.

Добавлено через 2 минуты
Только не вздумай использовать такой код в реальных проектах:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
void strcpy(char *from, char *to) {
    while (*to++=*from++);
 
    }
int main()
{
    char f[] = "The array of chars\n";
    char t[] = "An Array of chars!\n";
    strcpy(f,t);
    std::cout<<t;
    return 0;
}
0
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
03.04.2011, 13:16 #14
Цитата Сообщение от nxnx Посмотреть сообщение
указатель указывает на область памяти, в которую нельзя писать.
неверно, =)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
void strcpy(char* &from, char* &to) {
        to = from;
}
int main()
{
    char* f = "The array of chars";
    char* t = "An Array of chars!";
    std::cout<<t<<'\t'<<&t<<std::endl;
    std::cout<<f<<'\t'<<&f<<std::endl;
    strcpy(f,t);
    std::cout<<t<<'\t'<<&t<<std::endl;
    std::cout<<f<<'\t'<<&f<<std::endl;
    return 0;
}
0
Evg
Эксперт CАвтор FAQ
17826 / 6036 / 388
Регистрация: 30.03.2009
Сообщений: 16,566
Записей в блоге: 26
03.04.2011, 13:19 #15
Цитата Сообщение от nxnx Посмотреть сообщение
Только не вздумай использовать такой код в реальных проектах
Иногда полезно всё-таки читать тему (благо она пока небольшая), чтобы не боянить

Vladimir., у тебя тоже копируются указатели, а не данные. Так что неверен твой код

Добавлено через 1 минуту
По поводу строковых литералов (строка в кавычках): Изменить значение указателя
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2011, 13:19
Привет! Вот еще темы с ответами:

strcpy - C++
Недавно начал программировать на C++, в типах плохо ещё разбираюсь... не могу понять, что надо исправить, чтобы код: char szSendBuff; ...

strcpy() - C++
Ребята! Помогите с задачкой! С помощью функции strcpy() заменить в строке три символа, начиная со второго. Для замены вводим короткую...

strcpy - C++
прога пашет,но после сортировки по результату,он выдает какойто корявый список,тоесть strcpy неверно пашет...... че с ней теперь...

Strcpy в vs2012 - C++
Недавно перешел из devc++ в vs2012, после копирования кода в vs2012, выдает ошибку при использовании ф-ии strcpy (команду для препроцессора...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.04.2011, 13:19
Ответ Создать тему
Опции темы

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