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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ф-ция strncpy 
:(
    Опции темы
ret
Дата 22.11.2005, 18:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











помогите понять работу ф-ции strncpy. Вот например что она делает в данном куске кода
Код


#include <iostream.h>
#include <string.h>
class Names
{
public:
Names(char *pName)
{
strncpy(name, pName, sizeof(name));
name[sizeof(name) — 1] = '\0';
}
protected:
char name[40];
};
[/code]
  Вверх
Darhazer
Дата 22.11.2005, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 28.9.2005
Где: HellCity (Sofia, Bulgaria)

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



Код

char *strncpy(
   char *strDest,
   const char *strSource,
   size_t count 
);

Copy characters of one string to another


т.е. записиваеть count символов из strSource в strDest


--------------------
I'm a wheel, I'm a wheel, I can roll, I can feel
But you can't stop me turning
'Cause I'm the sun, I'm the sun, I can move, I can run
But you'll never stom me burning
PM MAIL WWW ICQ YIM   Вверх
Дрон
Дата 22.11.2005, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



ret
Эта функция копирует не более заданного количества символов из одного массива в другой.

В данном коде в классе Names есть массив name из 40 символов, в конструктор этого класса передаётся некий массив символов (строка). Если длина этой строки меньше 40, то она будет полностью скопирована в массив name, если же больше, то будут скопированы только первые её 40 символов, причём последний из них заменён на символ \0 -- конец строки.


--------------------
Да. Именно так.
PM   Вверх
Mayk
Дата 22.11.2005, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



NB
Цитата

В данном коде в классе Names есть массив name из 40 символов, в конструктор этого класса передаётся некий массив символов (строка). Если длина этой строки меньше 40, то она будет полностью скопирована в массив name, если же больше, то будут скопированы только первые её 40 символов, причём последний из них заменён на символ \0 -- конец строки.

Ключевые слова - в данном коде. Важно помнить что сама ф-ция strncpy не завершит строку целевую строку 0, если исходная строка содержит большее кол-во символов.
Код

#include <stdio.h>
#include <string.h>
int main() 
{
        char s[2];
        strncpy(s,"hello",2);
        printf("s[0..1]=%c%c\n",*s,s[1]);
}

вывод
Код

he

строка s не содержит завершаюший символ


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Guest
Дата 22.11.2005, 20:14 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Дрон , а разве sizeof не вычисляет размер объекта в байтах ? Тут почему-то она выдаёт кол-во элементов в массиве
  Вверх
Void
Дата 22.11.2005, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(Guest @ 22.11.2005, 22:14)
а разве sizeof не вычисляет размер объекта в байтах ? Тут почему-то она выдаёт кол-во элементов в массиве

Maybe потому что sizeof(элемент) == 1? smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Дрон
Дата 22.11.2005, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Цитата(Guest @ 22.11.2005, 20:14)
Дрон , а разве sizeof не вычисляет размер объекта в байтах ? Тут почему-то она выдаёт кол-во элементов в массиве

Да, sizeof для для статического массива даёт размер массива в байтах. Но т.к. размер char как раз равен 1 байту, то мы сразу получаем количество элементов массива.

Совсем уж по-хорошему надо было бы писать так:
Код
name[sizeof(name)/sizeof(name[0]) - 1] = '\0';

Тогда бы независимо от того, какого типа у нас name, мы бы получили правильный результат.

Это сообщение отредактировал(а) Дрон - 22.11.2005, 20:26


--------------------
Да. Именно так.
PM   Вверх
nikitao
Дата 22.11.2005, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



Цитата
Тогда бы независимо от того, какого типа у нас name, мы бы получили правильный результат.

Лучше вот так писать всегда(даже когда char)
Код

name[sizeof(name)/sizeof(name[0]) - 1] = '\0';

А то вдруг в мире произойдет катаклизм и char будет весить 2 байта,тогда наш код будет работать,а вот верхний нет.Так просто безопасней с точки зрения переносимоcти.(ИМХО)



--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Void
Дата 23.11.2005, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(nikitao @ 23.11.2005, 01:16)
А то вдруг в мире произойдет катаклизм и char будет весить 2 байта

char может весить хоть 4 байта, на его sizeof это не повлияет. sizeof(char) == sizeof(signed char) == sizeof(unsigned char) == 1 - это жестко закреплено в стандарте. "Байты" возвращаемые sizeof, не обязаны быть 8-битными.
Тем не менее, писать лучше именно так, как ты написал - вдруг мы с char перейдем на wchar_t smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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