Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция strncpy 
V
    Опции темы
IKM2007
Дата 10.5.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Код

#include <iostream>
using namespace std;
void main()
{
char *a=new char[17];
strncpy(a,"123456789123456789123456789",17);
cout<<a<<endl;
}

Почему на экране появляется более 30-и символов
Цитата

12345678912345678¤¤¤¤▌▌▌▌▌▌▌▌▌▌▌q
Press any key to continue


,если я копирую в массив a 17 символов?
Заранее, Спасибо.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
archimed7592
Дата 10.5.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Потому что ф-ция, в случае неумещения в рамки не добавляет trailing zero. На сайте, который я тебе дал вчера, об этом должно быть написано ;).

Нужно так:
Код

const int arrSize = 17;
char *a=new char[arrSize];
strncpy(a,"123456789123456789123456789", arrSize - 1);
a[arrSize - 1] = '\0';

Т.е. явно убеждаться, обнулять последний элемент массива.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
IKM2007
Дата 10.5.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



archimed7592, а почему при cout<<a; печатается окончательное число символов, если нет завершающего символа? smile
И вообще, откуда эти символы беруться???

Это сообщение отредактировал(а) IKM2007 - 10.5.2008, 11:58


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
bronislav
Дата 10.5.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



Я не archimed7592, но отвечу =)

Операторы <<  и >> перегружены для char*, и поэтому такое нармально вводится


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
IKM2007
Дата 10.5.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



bronislav, можно поподробней.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
W4FhLF
Дата 10.5.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Потому, что в С/С++ признаком конца строки является символ '\0'. При выделении памяти под массив, эта память, в твоём случае, заполняется мусором и когда ты посылаешь данные, расположенные по этому адресу в памяти, на печать в консоль поток вывода печатает все данные, пока не встретит символ '\0'. Теоретически, он может напечатать и миллион ненужных тебе символов, пока встретит символ конца строки. В твоём случае, после "12345678912345678¤¤¤¤▌▌▌▌▌▌▌▌▌▌▌q" в массива оказался нулевой байт и печать прекратилась. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
MAKCim
Дата 10.5.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(IKM2007 @  10.5.2008,  11:53 Найти цитируемый пост)
И вообще, откуда эти символы беруться???

из области памяти с начальным адресом a + 17
если брать имплементацию аллокатора в GCC, то по этому адресу скорее всего будет находится блок метаинформации о ранее выделенном блоке памяти


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
IKM2007
Дата 10.5.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



W4FhLF, Спасибо за исчерпивающий ответ, Премного блогадарен! smile

Добавлено через 4 минуты и 44 секунды
MAKCim, я вообще то пользуюс Visual C++, так что не знаю
Цитата(MAKCim @  10.5.2008,  12:46 Найти цитируемый пост)
если брать имплементацию аллокатора в GCC, то по этому адресу скорее всего будет находится блок метаинформации о ранее выделенном блоке памяти

но все равно пасиб smile 


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
archimed7592
Дата 10.5.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



IKM2007, может обратишь уже свой взор в сторону прикреплённой темы http://forum.vingrad.ru/index.php?show_typ...showtopic=60932 ? smile 


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
lp_sun
Дата 10.5.2008, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.12.2007

Репутация: нет
Всего: нет



ребят, помоги заодно и мне вкурить такую фишку:
Код

#include <stdio.h>
#include <conio.h>
#include <string>

int main()
{        
    char pntr_shm[10];
    
    int msg_size=1023; 

    strncpy(pntr_shm,(char*)&msg_size,sizeof(int));
    
    int b;
    strncpy((char*)&b,pntr_shm,sizeof(int));

    printf("%d\n",b);
        
    getch();
    return 0;
}


если msg_size=1023 или 1025 или другие значения то все копируется нормально и в b в результате получаем наше значение, но если в msg_size записать 1024 то в b будет 0. Я так понимаю это связано с тем что под 1024 какой то управляющий символ и strncpy поэтому работает некорректно????? объясните плиз
и тогда подскажите эквивалент какой нить этой функции шоб она просто по указателям опредеоенные блоки памяти копировала 
PM MAIL   Вверх
archimed7592
Дата 11.5.2008, 00:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



lp_sun, во-первых, это зависит от того, чем pntr_shm инициализирован.
Во-вторых, это зависит от endianness - порядка байт в машинном слове.
К примеру, если msg_size=2048, то скорее всего тоже будет b=0.
Объясняется это так.
Если разбить 1024 на байты, то получится следующее: 00 00 04 00. Если записать это дело задом наперёд(как это, скорее всего, хранится в памяти твоего компьютера), то получим 00 04 00 00 - как видишь первым байтом(читай первым символом в строке) будет ноль, а ноль - это признак конца строки, откуда strncpy делает вывод о том, что далее копировать не нужно.
Если, разбить 1025 на байты, то получим 00 00 04 01, что задом наперёд будет 01 04 00 00 - т.е. первые два байта будут скопированны, остальные нет(но они и так нули).
Аналогично 1023: 00 00 03 FF -> FF 03 00 00.

Какой вывод нужно сделать? Такой, что ф-ции str*** предназначены для работы со строками и ни с чем иным. Для работы с raw памятью имеются, к примеру ф-ции mem***.

Добавлено через 50 секунд
Цитата(lp_sun @  10.5.2008,  23:40 Найти цитируемый пост)
и тогда подскажите эквивалент какой нить этой функции шоб она просто по указателям опредеоенные блоки памяти копировала  

memcpy


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
lp_sun
Дата 11.5.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.12.2007

Репутация: нет
Всего: нет



archimed7592, благодарю за развернутый ответ smile) все понятно

Это сообщение отредактировал(а) lp_sun - 11.5.2008, 00:38
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0872 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.