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

Как установить конец строки при своей реализации функции strcpy()?

14.04.2016, 17:34. Показов 1569. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, попробовал сам реализовать функцию strcpy().
Программа работоспособная, но интересует один момент.
Это рабочий вариант.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
void mystrcpy(char *t, char *str);
int main()
{
 char to[80] = "PRIVET";
 char from[80] = "ETO CKOPIROVALI IZ 2go MASSIVA";
 cout << "coder>|<anue 1 cTpoku: " << to << '\n';
 mystrcpy(to, from);
 cout << to;
 
 return 0;
}
 
void mystrcpy(char *t, char *str)
{
 int i;
 for(i=0; str[i]; i++) t[i] = str[i];
}
Как установить конец строки при своей реализации функции strcpy()?



А при такой записи компилятор начинает ругаться, почему?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
void mystrcpy(char *t, char *str);
int main()
{
 char to[80] = "PRIVET";
 cout << "coder>|<anue 1 cTpoku: " << to << '\n';
 mystrcpy(to, "ETO CKOPIROVALI IZ 2go MASSIVA");
 cout << to;
 
 return 0;
}
 
void mystrcpy(char *t, char *str)
{
 int i;
 for(i=0; str[i]; i++) t[i] = str[i];
}
Как установить конец строки при своей реализации функции strcpy()?

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2016, 17:34
Ответы с готовыми решениями:

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

Как установить курсор в конец строки?
Всем доброго времени суток. Столкнулся с трудностью... Имеется поле: &lt;div id=&quot;text&quot;...

Как установить курсор в конец строки в Memo?
Как установить курсор в конец строки в Memo?

Как в комбобоксе программно установить курсор в конец строки?
Добрый день! Подскажите пожалуйста, как в комбобоксе программно установить курсор в конец строки?...

17
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
14.04.2016, 17:39 2
Лучший ответ Сообщение было отмечено BeetleGold как решение

Решение

Так попробуй:
C++
1
void mystrcpy(char *t, const char *str)
В любом случае ты не устанавливаешь конец строки '\0' после копирования.
1
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 23
14.04.2016, 17:57  [ТС] 3
Спасибо, помогло.
Так разве конец строки не устанавливается автоматически?
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
14.04.2016, 21:29 4
Если ты сам символы копируешь, то кто его установит-то?
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
14.04.2016, 22:30 5
Цитата Сообщение от BeetleGold Посмотреть сообщение
Так разве конец строки не устанавливается автоматически?
Это как это?
0
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 23
15.04.2016, 12:54  [ТС] 6
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это как это?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int mystrlen(const char *str);
int main()
{
 cout << "dlina stroki PRIVET VSEM ravna: ";
 cout << mystrlen("PRIVET VSEM");
 return 0;
}
 
int mystrlen(const char *str)
{
 int i;
 for(i=0; str[i]; i++);
 return i;
}

Возьмем к примеру эту программу. При инициализации функции mystrlen(), цикл for использует массив str[i] как выражение. Массиву str[i] передается строка "PRIVET VSEM", как только строка заканчивается цикл прекращается (а закончится он в том случае ели выражение станет ложным), следовательно после строки автоматически устанавливается нулевой элемент. При выполнении программы на экране выведется (dlina stroki PRIVET VSEM ravna: 11)
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
15.04.2016, 13:05 7
BeetleGold, скопируй в свой массив сначала длинную строку, выведи на экран. Потом скопируй в этот же масссив короткую строку. выведи на экран (можно и длины вывести тоже).

Добавлено через 29 секунд
В одной программе, конечно же.
0
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 23
15.04.2016, 13:05  [ТС] 8
Цитата Сообщение от grizlik78 Посмотреть сообщение
BeetleGold, скопируй в свой массив сначала длинную строку, выведи на экран. Потом скопируй в этот же масссив короткую строку. выведи на экран (можно и длины вывести тоже).
Добавлено через 29 секунд
В одной программе, конечно же.
Извините, но речь не об этом))))
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
15.04.2016, 13:09 9
Об этом. Твоя функция копирования не копирует завершающий ноль. А должна.
0
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 23
15.04.2016, 13:21  [ТС] 10
Цитата Сообщение от grizlik78 Посмотреть сообщение
Об этом. Твоя функция копирования не копирует завершающий ноль. А должна.
Все понял что вы пытались до меня донести

Как то так получилось
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
void mystrcpy(char *t, const char *str);
int main()
{
 char to[80] = "ETO ZAPISANO V 1m MASSIVE";
 cout << "coder>|<anue 1 cTpoku: " << to << '\n';
 mystrcpy(to, "PRIVET");
 cout << "coder>|<anue posle kopirovani9: " << to;
 
 return 0;
}
 
void mystrcpy(char *t, const char *str)
{
 int i;
 for(i=0; str[i]; i++) t[i] = str[i];
 t[i] = str[i+1];
}
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
15.04.2016, 13:24 11
Лучший ответ Сообщение было отмечено BeetleGold как решение

Решение

+1 лишняя.
C++
1
2
3
4
5
6
void mystrcpy(char *t, const char *str)
{
 int i;
 for(i=0; str[i]; i++) t[i] = str[i];
 t[i] = str[i];
}
или
C++
1
2
3
4
5
void mystrcpy(char *t, char const *str)
{
 for(int i=0; (t[i] = str[i]) != '\0'; i++)
     ;
}
1
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 23
15.04.2016, 13:33  [ТС] 12
Цитата Сообщение от grizlik78 Посмотреть сообщение
+1 лишняя.
да, логично что-то я засуетился.

Цитата Сообщение от grizlik78 Посмотреть сообщение
(t[i] = str[i]) != '\0'
не соображу. это получается как только str[i] укажет на нулевой элемент,цикл же все равно остановится

Аааа, дошло. Но до того как цикл завершится t[i] уже передастся нулевой элемент
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
15.04.2016, 13:34 13
Цитата Сообщение от BeetleGold Посмотреть сообщение
не соображу. это получается как только str[i] укажет на нулевой элемент,цикл же все равно остановится
Да. Но копирование производится перед проверкой.
1
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 23
15.04.2016, 13:38  [ТС] 14
Цитата Сообщение от BeetleGold Посмотреть сообщение
Аааа, дошло. Но до того как цикл завершится t[i] уже передастся нулевой элемент
Цитата Сообщение от grizlik78 Посмотреть сообщение
Да. Но копирование производится перед проверкой.
Все понял, понял. Спасибо.
0
2662 / 2237 / 240
Регистрация: 03.07.2012
Сообщений: 8,138
Записей в блоге: 1
15.04.2016, 13:38 15
Можно и так:
C++
1
for(int i=0; t[i] = str[i]; i++);
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
15.04.2016, 17:21 16
А можно так:
C++
1
2
3
4
void mystrcpy(char *t, char const *str)
{
    while(*t++=*str++);
}
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
15.04.2016, 18:10 17
Цитата Сообщение от BeetleGold Посмотреть сообщение
следовательно после строки автоматически устанавливается нулевой элемент.
Нулевой элемент в данном случае действительно является неявно ("автоматически") добавленным элементом строкового литерала "PRIVET VSEM". Т.е. компилятор сам добавляет в строковые литералы замыкающий ноль. Но это распространяется только на строковые литералы. Больше никуда компилятор "автоматически" замыкающий ноль добавлять не станет. Поэтому если вы хотите куда-то самостоятельно скопировать содержимое строкового литерала, то копировать этот ноль вам тоже придется явно и самостоятельно.
1
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 23
15.04.2016, 18:16  [ТС] 18
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нулевой элемент в данном случае действительно является неявно ("автоматически") добавленным элементом строкового литерала "PRIVET VSEM". Т.е. компилятор сам добавляет в строковые литералы замыкающий ноль. Но это распространяется только на строковые литералы. Больше никуда компилятор "автоматически" замыкающий ноль добавлять не станет. Поэтому если вы хотите куда-то самостоятельно скопировать содержимое строкового литерала, то копировать этот ноль вам тоже придется явно и самостоятельно.
Да маленько разобрался с этим, но все равно спасибо
0
15.04.2016, 18:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2016, 18:16
Помогаю со студенческими работами здесь

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

Как определить конец строки при вводе с консоли?
Необходимо считать строку неизвестной длины с консоли посимвольно (используется cin). Как...

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

Как задать конец строки и прекратить при вводе определённого символа?
Добрый день! Подскажите, пожалуйста, как задать конец строки при вводе определённого символа....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru