Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Yashman
1 / 3 / 0
Регистрация: 02.07.2011
Сообщений: 90
#1

Запись указателя на строку в массив - C++

19.08.2011, 15:50. Просмотров 1442. Ответов 22
Метки нет (Все метки)

Всем привет! Вот у меня проблемка появилась, не знаю, что делать. Помогите пожалуйста!
Есть структура
C++
1
2
3
4
5
struct golf
{
       char fullname[Len];
       int handicap;
};
и прототип функции
C++
1
void setgolf(golf & g, char *name, int hc);
этой функции надо передать имя структуры, полное имя игрока в гольф и его гандикап(handicap)<- не знаю, что это такое

Вот вызов функции
C++
1
setgolf(ann, "Ann Birdfreee", 24);
А вот и сам функция
C++
1
2
3
4
5
void setgolf (golf & g, char *name, int hc)
{
     g.fullname = name;
     g.handicap = hc;
}
проблемма в том, что name - указатель на char, а g.fullname это массив и компиль не даёт
их приравнять, пишет: incompatible types in assignment of `char*' to `char[40]' . Как решить эту проблемму?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2011, 15:50     Запись указателя на строку в массив
Посмотрите здесь:

Возврат указателя на строку из фукнции - C++
Снова я пришел к вам со строками. Читаю &quot;Как программировать на С++&quot; и там везде пишут про инкапсуляцию, сокрытие данных. Так чтоб мы...

Передача указателя на строку методу класса - C++
после того как я изменил содержание указателя name на Nika Gamkrelidze, name в объекте не изменилось. наверное потому что новое значение...

Вывод текста и указателя в одну строку - C++
char *t = decToBin(i); Memo4-&gt;Lines-&gt;Add(t); Как мне добавить текст в начале что бы было: &quot;Текст&quot;+*значение переменной...

Ввести в структуру в виде указателя строку из нескольких слов - C++
Нужно сделать структуру с помощью new. Надо чтобы программа запрашивала диаметр пиццы, название компании из нескольких слов и вес. При...

Преобразование указателя в массив - C++
Всем привет. Есть указатель с типом const u_char * , известно , что он указывает на N байт. Как преобразовать его в массив; Пробовал...

Проверка указателя на массив - C++
Как нам проверить, что указатель указывает на пямять, выделенную в куче, а не на стеке? например такой код для простоты. Так как в таком...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
germeticus
27 / 27 / 1
Регистрация: 21.06.2011
Сообщений: 82
20.08.2011, 01:19     Запись указателя на строку в массив #16
Исключение - проблема, которая может возникнуть при работе программы и приведет к невозможности (бессмысленности) дальнейшей отработки программой её базового алгоритма.
Сперто из Вики.

В данном случае этот термин вполне применим.

А код более безопасен, тем, что исключение никак не может возникнуть в рамках этих двух строчек. В предыдущем случае, теоретически могла возникнуть какая-нибудь ошибка вне рамок этих строк, влияющая на их работу.

Как-то так, благодарен за въедливые вопросы)))))
Если не прав поправьте)
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
20.08.2011, 01:28     Запись указателя на строку в массив #17
Ну ладно, чёрт с ними с исключениями Считать ли данную ситуацию исключением или нет, зависит от разных обстоятельств. Пусть исключения.

Итак, речь о том, что код
C
1
2
strncpy(g->fullname, name,sizeof(g->fullname) - 1);
g->fullname[sizeof(g->fullname) - 1] = '\0';
якобы более безопасен, чем
C
1
2
strncpy( g->fullname, name, Len );
g->fullname[Len - 1] = '\0';
Вот мне и стало интересно, чем же он более безопасен, и что за ошибки могут повлиять на работу второго кода (не влияя на первый).
germeticus
27 / 27 / 1
Регистрация: 21.06.2011
Сообщений: 82
20.08.2011, 01:45     Запись указателя на строку в массив #18
Цитата Сообщение от grizlik78 Посмотреть сообщение
Вот мне и стало интересно, чем же он более безопасен, и что за ошибки могут повлиять на работу второго кода (не влияя на первый).
уххх)))
1. Мы могли бы перепутать названия. Например массив задавать fullname[Lan], а у нас еще где есть переменная или константа Len. Все бы прекрасно откомпилировалось бы, а вот ошибку бы замучились искать.
2. Константа Len могла бы быть задана не как константа, со всеми вытекающими последствиями.
3. Может возникнуть конфликт переменных вообще говоря.

Примерно так. То есть, в случае каких-то ляпов в других местах программы, эти две строчки более устойчивы.

Еще раз спасибо)))
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
20.08.2011, 02:11     Запись указателя на строку в массив #19
Ну перепутать-то можно что угодно и где угодно, и ничего от этого не спасает, как показывает практика.
От конфликта имён и "перепутываний" лучше помогают более осмысленные и многословные идентификаторы, в неком выдержанном стиле.
А вот в устойчивости я всё равно не уверен. Массив может быть заменён динамическим, тогда sizeof() будет давать размер указателя.
Тип элементов массива может измениться с char на wchar_t, к примеру, тогда заменив strncpy на wcsncpy про sizeof() опять же можно и подзабыть. И хотя переполнения в данном случае не произойдёт, но всё-равно, приятного мало.
Дело вкуса, короче.

Добавлено через 9 минут
Цитата Сообщение от grizlik78 Посмотреть сообщение
И хотя переполнения в данном случае не произойдёт
А, нет, наврал. Как раз в данном случае оно вполне возможно.
germeticus
27 / 27 / 1
Регистрация: 21.06.2011
Сообщений: 82
20.08.2011, 02:14     Запись указателя на строку в массив #20
Да, вы правы, код не переносим. Но мы про переносимость и не говорили) Надо еще делить на размер элемента.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.08.2011, 10:06     Запись указателя на строку в массив #21
Цитата Сообщение от germeticus
Если чистый С, то тогда уж так:
C
1
void setgolf (golf *g, char* name, int hc)
Цитата Сообщение от Olga_
Если чистый Си, то действительно так и только так
там нельзя сразу к метке структуры обращаться
Yashman
1 / 3 / 0
Регистрация: 02.07.2011
Сообщений: 90
20.08.2011, 14:06  [ТС]     Запись указателя на строку в массив #22
Спасибо всем всем всем! Кстати, а откуда взялось мнение, что я на С пишу? Я только С++ изучаю.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2011, 21:18     Запись указателя на строку в массив
Еще ссылки по теме:

вывод указателя на массив на массив - C++
#include &lt;iostream&gt; using namespace std; void main() { char i={{'g'},{'d'},{'r'},{'a'},{'f'}}; for (int k=0; k&lt;5;...

Возврат указателя на массив указателей - C++
Доброго времени суток. Есть программа, где куча методов должны работать с одни массивом указателей. Как мне сделать, чтобы в функции...

Возврат указателя на массив из функции - C++
День добрый, коллеги по цеху. Не откажите в нужде java программисту в познаниях нативного кода. Запутался я совсем в указателях. Как...

Возвращения указателя на массив из функции - C++
Как возвратитьуказатель на массив из функции в другую функцию и потом воспользоаваться этим массивом? #include &quot;stdafx.h&quot; ...


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

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
20.08.2011, 21:18     Запись указателя на строку в массив #23
Цитата Сообщение от germeticus Посмотреть сообщение
Если быть все же педантичным, то такой код будет побезопасней
C
1
2
strncpy(g->fullname, name,sizeof(g->fullname) - 1);
     g->fullname[sizeof(g->fullname) - 1] = '\0';
Ну и конечно обработать исключение, когда длина name больше fullname.
Вот только не надо меня поправлять! Ваш код ничем не безопаснее, а лишь демонстрирует то, что вы чувствуете неуверенность, как работает strncpy. Только и всего! Но это не имеет отношение к С++, и тем более безопасности кода, а имеет отношение лишь к тому, что вы четко не знаете работу strncpy, а потому занимаетесь всякими глупостями!
Yandex
Объявления
20.08.2011, 21:18     Запись указателя на строку в массив
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru