Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 23

Поведение функции strncpy

21.04.2015, 17:59. Показов 3231. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, уважаемые форумчане. Была необходимость решить задачу такого содержания: Пользователь вводит строку с помощью char массива, а также определяет отрезок от m до n символа из этой строки, который записуется в другой массив и выводится на экран. Моя реализация такая:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
 
void main()
{
    setlocale(LC_ALL, "rus");
 
    int maxlen = 100;                   //определяем длину строки
    char *str = new char[maxlen];       //выделение памяти для строки источника
    
    
    cout << "Введите исходную сроку\n";
    gets(str);
    int len = strlen(str); //определене длины строки
        
    //задание интервала копирования
    int m, n;
    do
    {
        cout << "Введите начало интервала для копирования от 1 до  " << len << "\t";
        cin >> m;
    } while (m < 0 || m > len);
    
    do
    {
        cout << "Введите конец интервала для копирования от " << m << " до " << len << "\t";
        cin >> n;
    } while (n < m || m > len);
    
    cout << "\n\n";
    
    //копирование из одной строки в другую
    char *newstr = new char[n - m + 1];         //выделение памяти для строки приемника
    char* ptr=str;
    ptr = str + m-1;            //смещение указателя на позицию m 
    strncpy(newstr, ptr, char (n-m+1)); //копирование символов от m до n
        
    system("CLS");
    cout << "\nИсходная строка \n";
    cout << str;
    cout << "\nCтрока, полученная копированием с " << m <<"-го по " << n << "-й символ\n";
    cout << newstr;
        
    delete[]str;
    
    cout << "\n\n"; 
}
проблема заключается в копировании, если newstr создавать без указания размера, то копируется только 15 символов, если указать размер n-m, то копируется сколько надо + еще какой-то мусор. Перелопатив кучу литературы, так и не стало понятно, что не так.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.04.2015, 17:59
Ответы с готовыми решениями:

Ошибка в функции (strncpy)
Надо прочитать файл содержащий что-то подобное: 1. Nomer reisa: 1 ves bagazha: 1.50 (kg) kolichestvo veshei: 5 2. Nomer reisa: 1 ves...

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

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

4
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
21.04.2015, 18:10
Функция копирует из строки src в буфер dst не более чем len символов (включая нулевой символ), не гарантируя завершения строки нулевым символом
отсюда https://ru.wikipedia.org/wiki/Strncpy
следовательно у тебя в newstr нет завершающего нуля и это не строка
чтобы стало строкой нужно сделать так
C++
1
2
3
char *newstr = new char[n - m + 2];         //выделение памяти для строки приемника
strncpy(newstr, ptr, char (n-m+1)); //копирование символов от m до n
newstr[n-m+1]=0;
1
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
21.04.2015, 18:11
Лучший ответ Сообщение было отмечено vittenberg как решение

Решение

Вам нужно закрыть строку newstr
В строке 39
C++
1
newstr[n-m+1] = '\0';
Да, и памяти выделить на 1 больше - ValeryS прав.
1
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 23
21.04.2015, 21:44  [ТС]
Большое спасибо, теперь буду знать, что строку надо закрывать. ValeryS, на вики написано, что буфер добивается нулями, а у меня почему-то был мусор
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
21.04.2015, 21:58
Цитата Сообщение от vittenberg Посмотреть сообщение
ValeryS, на вики написано, что буфер добивается нулями,
Если длина строки src меньше len, то буфер добивается до len нулями.
но у тебя то размер исходной строки больше, вот и не добивается
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.04.2015, 21:58
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru