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

Как работает strncpy()? - C++

Восстановить пароль Регистрация
 
 
anti-k
 Аватар для anti-k
226 / 74 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
06.10.2015, 07:38     Как работает strncpy()? #1
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
#include<iostream>
#include<cstring>
using namespace std;
char*input(char*word,int&size){
    cin.getline(word,size);
    size=strlen(word);
    char*ch=new char[size];
    strncpy(ch,word,size);
    delete[]word;
    return ch;
}
int main(){
    int n=100;
    char*ch=new char[n];
    ch=input(ch,n);
    int k=n;
    char*che=new char[k];
    che=input(che,k);
    cout<<"\n"<<ch;
    cout<<"\n"<<che<<endl;
    char*ptr=strstr(ch,che);
    cout<<*ptr;
    return 0;
}
выдает что то такое
Миниатюры
Как работает strncpy()?  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2015, 07:38     Как работает strncpy()?
Посмотрите здесь:

про strncpy () C++
strncpy C++
C++ Странности в поведении strncpy
C++ Задание по копированию строк, strncpy
C++ Ошибка в функции (strncpy)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
06.10.2015, 07:57     Как работает strncpy()? #2
Если длина строки-источника ( src ) меньше size, то последние size - strlen( src ) символов строки-приемника ( dst ) заполняются нулями. Если длина строки-источника ( src ) равна или больше size, то, само собой, в конце строки-приемника ( dst ) нуля не будет и за этим придется следить самому.
Black Fregat
 Аватар для Black Fregat
1353 / 983 / 215
Регистрация: 31.05.2009
Сообщений: 4,093
06.10.2015, 08:03     Как работает strncpy()? #3
Цитата Сообщение от Toshkarik Посмотреть сообщение
последние size - strlen( src ) символов строки-приемника ( dst ) заполняются нулями
Откуда Вы это взяли? Можно ссылку? Насколько говорит мой опыт, будет записан ровно один завершающий ноль.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
06.10.2015, 08:06     Как работает strncpy()? #4
Не помню точно, где я про это читал, но нашел тоже самое в первой ссылке google https://ru.wikipedia.org/wiki/Strncpy
anti-k
 Аватар для anti-k
226 / 74 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
06.10.2015, 08:07  [ТС]     Как работает strncpy()? #5
Toshkarik, Немного непонятно (. n==100 при вызове инпута, затем оно меняется на strlen()(она как я понимаю возвращает результат с '\0'), где взялись остальные символы, в случае на картинке OWS
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
06.10.2015, 08:22     Как работает strncpy()? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Строка ch, которая создается в функции input имеет размер равный строке word после ввода. Известно, что размер строки не включает в себя символ конца строки ( ноль ). При копирование с помощью strncpy, size == strlen( word ). Собственно, поэтому и нет в конце терминального символа. Чисто случайно оказалось, что ноль был расположен после OWS. OWS в свою очередь является или мусором или данными, не имеющими никакого отношения к этой строке.
anti-k
 Аватар для anti-k
226 / 74 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
06.10.2015, 08:43  [ТС]     Как работает strncpy()? #7
Toshkarik, Исправил в соответствии с вашим рекомендациями, гляньте пожалуйста, вроде работает
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<iostream>
#include<cstring>
using namespace std;
char*input(char*word,int&size){
    cin.getline(word,size);
    size=strlen(word);
    char*ch=new char[size];
    strncpy(ch,word,size);
    delete[]word;
    *(ch+size)='\0';
    return ch;
}
int main(){
    int n=100;
    char*ch=new char[n];
    ch=input(ch,n);
    int k=n;
    char*che=new char[k];
    che=input(che,k);
    cout<<"\n"<<ch;
    cout<<"\n"<<che<<endl;
    char*ptr=strstr(ch,che);
    cout<<*ptr<<" "<<k<<endl;
    char*chee=new char[k];
    cin.getline(chee,k+1);
    cout<<chee<<endl;
    strncpy(ptr,chee,k);
    cout<<ch;
    return 0;
}
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
06.10.2015, 08:51     Как работает strncpy()? #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от anti-k Посмотреть сообщение
*(ch+size)='\0';
Здесь у Вас выход за пределы массива. Вам нужно выделять size+1 для ch, так как, как я уже говорил, strlen возвращает размер не учитывая терминальный символ.
Исправьте только здесь:
C++
1
char*ch=new char[size + 1];
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
06.10.2015, 08:52     Как работает strncpy()? #9
В данном случае так-то оно так.
Но Википедия очень ненадежный источник подобной технической информации.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
06.10.2015, 08:55     Как работает strncpy()? #10
Цитата Сообщение от daslex Посмотреть сообщение
Но Википедия очень ненадежный источник подобной технической информации.
Я и не говорил, что я оттуда взял эту информацию. Я забыл книгу, где это было написано. Ссылку привел как первую попавшуюся по запросу в google.
anti-k
 Аватар для anti-k
226 / 74 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
06.10.2015, 08:59  [ТС]     Как работает strncpy()? #11
Toshkarik, если
C++
1
char*ch=new char[size + 1];
в таком случае
C++
1
*(ch+size)='\0';
не нужен?, я правильно понимаю?
то есть strncpy добавит последний 0 сама?
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
06.10.2015, 09:00     Как работает strncpy()? #12
да можно вот эту было дать
http://www.cplusplus.com/reference/c...py/?kw=strncpy
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
06.10.2015, 09:02     Как работает strncpy()? #13
anti-k, нужен.

Цитата Сообщение от daslex Посмотреть сообщение
да можно вот эту было дать
3 раз повторяю, я скопировал первую ссылку из google.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
06.10.2015, 09:09     Как работает strncpy()? #14

Не по теме:

Цитата Сообщение от Toshkarik Посмотреть сообщение
я скопировал первую ссылку из google.
Не обижайтесь, но плохому научите. Вы же и сами это осознаете намного лучше меня.


anti-k, еще delete []
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
06.10.2015, 09:12     Как работает strncpy()? #15
Цитата Сообщение от daslex Посмотреть сообщение
Не обижайтесь, но плохому научите. Вы же и сами это осознаете намного лучше меня.
На что ж тут обижаться. Я просто не могу понять, что Вам нужно. Научу кого? Меня попросили предоставить ссылку, я дал. Причем просил не автор топика. Вики вполне нормальный ресурс.
anti-k
 Аватар для anti-k
226 / 74 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
06.10.2015, 09:13  [ТС]     Как работает strncpy()? #16
Toshkarik, а как можно обеспечить защиту от выхода за пределы массива, в случае использования cin.getline(ch,10) и ввода с клавиатуры 10 и более значений?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
06.10.2015, 09:15     Как работает strncpy()? #17
anti-k, так cin.getline() при передаче ей вторым параметром числа 10 и не запишет больше 10 символов в строку ch.
anti-k
 Аватар для anti-k
226 / 74 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
06.10.2015, 09:24  [ТС]     Как работает strncpy()? #18
Toshkarik, в случае если я ввожу больше 10, меня выбрасывает из программы((
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
31
#include<iostream>
#include<cstring>
using namespace std;
char*input(char*word,int&size){
    cin.getline(word,size);
    cin.clear();
    size=strlen(word);
    char*ch=new char[size+1];
    strncpy(ch,word,size);
    delete[]word;
    *(ch+size)='\0';
    return ch;
}
int main(){
    int n=10;
    char*ch=new char[n];
    ch=input(ch,n);
    int k=n;
    char*che=new char[k];
    che=input(che,k);
    cout<<"\n"<<ch;
    cout<<"\n"<<che<<endl;
    char*ptr=strstr(ch,che);
    cout<<*ptr<<" "<<k<<endl;
    char*chee=new char[k+1];
    cin.getline(chee,k+1);
    cout<<chee<<endl;
    strncpy(ptr,chee,k);
    cout<<ch;
    return 0;
}
Добавлено через 2 минуты
и еще
C++
1
char*ch=new char[size+1];
C++
1
*(ch+size)='\0';
почему не size+1???
daslex
06.10.2015, 09:24
  #19

Не по теме:

Цитата Сообщение от Toshkarik Посмотреть сообщение
Вики вполне нормальный ресурс.
Вам показать пример его полит некорректности в данных вопросах?

одно дело: "Как оно работает". по-моему вообще никогда не стоит давать первое попавшееся. А только достоверное.
другое дело: "Как можно прокодить". тут уже можно давать первое попавшееся, но с небольшой оглядкой, пусть даже на собственный опыт.



MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2015, 09:31     Как работает strncpy()?
Еще ссылки по теме:

ошибка 4996 strncpy C++
Как заставить Strncpy вложить в itog часть символов строки str, если дина str больше, чем кол-во нужных нам символов? C++
Поведение функции strncpy C++

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
06.10.2015, 09:31     Как работает strncpy()? #20
Цитата Сообщение от daslex Посмотреть сообщение
Вам показать пример его полит некорректности в данных вопросах?
одно дело: "Как оно работает". по-моему вообще никогда не стоит давать первое попавшееся. А только достоверное.
другое дело: "Как можно прокодить". тут уже можно давать первое попавшееся, но с небольшой оглядкой, пусть даже на собственный опыт.

Не по теме:

Одно дело, если бы там действительно была недостоверная информация. Но, перед тем, как дать ссылку, я ее, конечно же, посмотрел. И написанное там совпало с моими знаниями. Поэтому мне до сих пор не понятна цель данной дискуссии. Если на странице вполне достоверная информация с нормальным изложением, я и буду предоставлять на нее ссылку. При этом не важно, вики это или cplusplus.

Yandex
Объявления
06.10.2015, 09:31     Как работает strncpy()?
Ответ Создать тему
Опции темы

Текущее время: 20:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru