![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ret |
|
|||
|
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 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 28.9.2005 Где: HellCity (Sofia, Bulgaria) Репутация: 2 Всего: 29 |
т.е. записиваеть 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 |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
ret
Эта функция копирует не более заданного количества символов из одного массива в другой. В данном коде в классе Names есть массив name из 40 символов, в конструктор этого класса передаётся некий массив символов (строка). Если длина этой строки меньше 40, то она будет полностью скопирована в массив name, если же больше, то будут скопированы только первые её 40 символов, причём последний из них заменён на символ \0 -- конец строки. -------------------- Да. Именно так. |
|||
|
||||
| Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
NB
Ключевые слова - в данном коде. Важно помнить что сама ф-ция strncpy не завершит строку целевую строку 0, если исходная строка содержит большее кол-во символов.
вывод
строка s не содержит завершаюший символ -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
| Guest |
|
|||
|
Unregistered |
Дрон , а разве sizeof не вычисляет размер объекта в байтах ? Тут почему-то она выдаёт кол-во элементов в массиве
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Maybe потому что sizeof(элемент) == 1? -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Да, sizeof для для статического массива даёт размер массива в байтах. Но т.к. размер char как раз равен 1 байту, то мы сразу получаем количество элементов массива. Совсем уж по-хорошему надо было бы писать так:
Тогда бы независимо от того, какого типа у нас name, мы бы получили правильный результат. Это сообщение отредактировал(а) Дрон - 22.11.2005, 20:26 -------------------- Да. Именно так. |
||||
|
|||||
| nikitao |
|
||||
![]() Кот-программист ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1206 Регистрация: 30.8.2005 Где: Спб Репутация: 1 Всего: 26 |
Лучше вот так писать всегда(даже когда char)
А то вдруг в мире произойдет катаклизм и char будет весить 2 байта,тогда наш код будет работать,а вот верхний нет.Так просто безопасней с точки зрения переносимоcти.(ИМХО) -------------------- Жизнь - печальная штука. |
||||
|
|||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
char может весить хоть 4 байта, на его sizeof это не повлияет. sizeof(char) == sizeof(signed char) == sizeof(unsigned char) == 1 - это жестко закреплено в стандарте. "Байты" возвращаемые sizeof, не обязаны быть 8-битными. Тем не менее, писать лучше именно так, как ты написал - вдруг мы с char перейдем на wchar_t -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |