С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774

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

06.10.2015, 07:38. Показов 3621. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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()?  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.10.2015, 07:38
Ответы с готовыми решениями:

Функция strncpy не работает на строках длинее трех символов
Подскажите, написал код... Хочу копировать каждое слово в g (т.е. s3). Функцией strncpy. Длину находит правильную, но при копировании...

Не работает strncpy в MV
Не работает strncpy в Micrisoft Visual Задача следущая: Нужно Преобразовать суму к прописному текстовому виду, например 2141 — Две...

Strncpy
Напишите пожауйста на С аналог функции Strncpy

25
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
06.10.2015, 07:57
Если длина строки-источника ( src ) меньше size, то последние size - strlen( src ) символов строки-приемника ( dst ) заполняются нулями. Если длина строки-источника ( src ) равна или больше size, то, само собой, в конце строки-приемника ( dst ) нуля не будет и за этим придется следить самому.
1
Фрилансер
 Аватар для Black Fregat
3709 / 2082 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
06.10.2015, 08:03
Цитата Сообщение от Toshkarik Посмотреть сообщение
последние size - strlen( src ) символов строки-приемника ( dst ) заполняются нулями
Откуда Вы это взяли? Можно ссылку? Насколько говорит мой опыт, будет записан ровно один завершающий ноль.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
06.10.2015, 08:06
Не помню точно, где я про это читал, но нашел тоже самое в первой ссылке google https://ru.wikipedia.org/wiki/Strncpy
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
06.10.2015, 08:07  [ТС]
Toshkarik, Немного непонятно (. n==100 при вызове инпута, затем оно меняется на strlen()(она как я понимаю возвращает результат с '\0'), где взялись остальные символы, в случае на картинке OWS
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
06.10.2015, 08:22
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Строка ch, которая создается в функции input имеет размер равный строке word после ввода. Известно, что размер строки не включает в себя символ конца строки ( ноль ). При копирование с помощью strncpy, size == strlen( word ). Собственно, поэтому и нет в конце терминального символа. Чисто случайно оказалось, что ноль был расположен после OWS. OWS в свою очередь является или мусором или данными, не имеющими никакого отношения к этой строке.
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
06.10.2015, 08:43  [ТС]
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;
}
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
06.10.2015, 08:51
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Цитата Сообщение от anti-k Посмотреть сообщение
*(ch+size)='\0';
Здесь у Вас выход за пределы массива. Вам нужно выделять size+1 для ch, так как, как я уже говорил, strlen возвращает размер не учитывая терминальный символ.
Исправьте только здесь:
C++
1
char*ch=new char[size + 1];
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
06.10.2015, 08:52
В данном случае так-то оно так.
Но Википедия очень ненадежный источник подобной технической информации.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
06.10.2015, 08:55
Цитата Сообщение от daslex Посмотреть сообщение
Но Википедия очень ненадежный источник подобной технической информации.
Я и не говорил, что я оттуда взял эту информацию. Я забыл книгу, где это было написано. Ссылку привел как первую попавшуюся по запросу в google.
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
06.10.2015, 08:59  [ТС]
Toshkarik, если
C++
1
char*ch=new char[size + 1];
в таком случае
C++
1
*(ch+size)='\0';
не нужен?, я правильно понимаю?
то есть strncpy добавит последний 0 сама?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
06.10.2015, 09:00
да можно вот эту было дать
https://www.cplusplus.com/refe... kw=strncpy
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
06.10.2015, 09:02
anti-k, нужен.

Цитата Сообщение от daslex Посмотреть сообщение
да можно вот эту было дать
3 раз повторяю, я скопировал первую ссылку из google.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
06.10.2015, 09:09

Не по теме:

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


anti-k, еще delete []
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
06.10.2015, 09:12
Цитата Сообщение от daslex Посмотреть сообщение
Не обижайтесь, но плохому научите. Вы же и сами это осознаете намного лучше меня.
На что ж тут обижаться. Я просто не могу понять, что Вам нужно. Научу кого? Меня попросили предоставить ссылку, я дал. Причем просил не автор топика. Вики вполне нормальный ресурс.
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
06.10.2015, 09:13  [ТС]
Toshkarik, а как можно обеспечить защиту от выхода за пределы массива, в случае использования cin.getline(ch,10) и ввода с клавиатуры 10 и более значений?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
06.10.2015, 09:15
anti-k, так cin.getline() при передаче ей вторым параметром числа 10 и не запишет больше 10 символов в строку ch.
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
06.10.2015, 09:24  [ТС]
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???
0
06.10.2015, 09:24

Не по теме:

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

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



0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
06.10.2015, 09:31
Цитата Сообщение от daslex Посмотреть сообщение
Вам показать пример его полит некорректности в данных вопросах?
одно дело: "Как оно работает". по-моему вообще никогда не стоит давать первое попавшееся. А только достоверное.
другое дело: "Как можно прокодить". тут уже можно давать первое попавшееся, но с небольшой оглядкой, пусть даже на собственный опыт.

Не по теме:

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

2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2015, 09:31
Помогаю со студенческими работами здесь

strncpy
Дана строка: djh,dfkh,sdj. Как последовательно по отдельности записать в strncpy текстовые части: djh dfkh sdj

с++ strncpy
Скажите пожалуйста, я не могу разобраться с фунуциями strncpy() и с её подобными. везде одна ошибка. Вот у меня тема следующая: char...

Strncpy
Одинаково неправильно работают следующие 2 кода: #include &lt;stdio.h&gt; #include &lt;string.h&gt; int main(void) { int n; char s1 =...

про strncpy ()
привет=))) вот чето с этой функцией не пойму пример есть #include &lt;iostream&gt; using namespacr std; int main () { const int...

Функция strncpy
Вопрос: Есть строка s, в этой строке есть элемент '\n' от которого мне нужно избиваться. Я хочу просто скопировать в другую строчку без...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru