Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2009, 00:26   #1
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию Вопрос по строкам (Visual c++)

Здраствуйте, я подошел к концу Главы "строки / разбор текста " и у меня возник вопрос.
Какое из следующих объявлений лучше всего использовать?(Ведь они примерно одинаковые).

char *s;
string s;
char s[];
JOFRIF вне форума Ответить с цитированием
Старый 23.07.2009, 00:53   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

смотря где и когда что использовать.
char *s = "123"; - указатель на константную строку (изменить ее будет нельзя).
string s; - класс строки. удобно использовать конкатенацию, поиск и тп, но к примеру, в файл ты такой тип строки просто так не запишешь, надо делать сериализацию (в любой момент можно получить СИ строку методом c_str())
char s[] - строка, представлена ввиде массива. грубо говоря, то же самое, что и первый вариант, только данные можно изменить
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 23.07.2009, 01:32   #3
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Цитата:
в файл ты такой тип строки просто так не запишешь, надо делать сериализацию (в любой момент можно получить СИ строку методом c_str())
Тогда какой наилучший вариант приминительно к файлам?

Цитата:
char *s = "123"; - указатель на константную строку (изменить ее будет нельзя).
Вообще... я не совсем понял это объявление.
Если взять этот пример char *s = "123"; то я понимаю его так.
Это строка "говорит": присвоить тому на что указывает данный указатель
строку "123", но так как у этого указателя нет адреса массива типа char (адреса первого элемента), то куда он "девает/засовывает" строку "123" и на что он указывает если у него нет никакого адреса.
Буду очень признателен если вы сможете мне это объяснить.
JOFRIF вне форума Ответить с цитированием
Старый 23.07.2009, 01:46   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Не совсем верно, char *s = "123"; На этапе компиляции размещает в Вашей программе строку "123"(в области данных), а затем присваивает переменной s указатель на эту строку.

Для работы со строками(модификация, конкатенация, поиск) я бы всё же советовал использовать string, так как для этого он, как и остальная часть стандартной библиотеки, и создавался.
netrino вне форума Ответить с цитированием
Старый 23.07.2009, 01:48   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Если с файлами работать, то имхо лучше память динамически выделять. То есть:
Код:
char *str;
// тут узнаем размер файла и пишем его, например, в N
str = (char*)malloc(sizeof(char)*N);
или
Код:
str = new char*[N];
для плюсов.

стринги - специальный класс строк. Имеет довольно удобные функции.

Цитата:
Если взять этот пример char *s = "123";
Строка помещается в память и адрес присваивается указателю s. Изменить эту строку уже нельзя.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.07.2009, 01:54   #6
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
char s[];
не думаю что компилятор пропустит такое объявление, обязательно нужно указать размерность массива или проинициализировать строку

Код:
char s[20];
char ss[]="stroka";
counter вне форума Ответить с цитированием
Старый 23.07.2009, 02:07   #7
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Цитата:
Строка помещается в память и адрес присваивается указателю s. Изменить эту строку уже нельзя.
Адрес первого элемента? или всей области данных?(хотя трудно представить указатель(не массив указателей) который хранит нное количество адресов.

Цитата:
Не совсем верно, char *s = "123"; На этапе компиляции размещает в Вашей программе строку "123"(в области данных), а затем присваивает переменной s указатель на эту строку.
То-есть это происходит так("за занавесом")?
1)На этапе компиляции размещает в Вашей программе строку "123"(в области данных)
2)char s;
3)char *s = &s;
4)*s = "123";

p.s Извините за шквал вопросов, просто хочу разобраться с этим.
JOFRIF вне форума Ответить с цитированием
Старый 23.07.2009, 02:10   #8
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
не думаю что компилятор пропустит такое объявление, обязательно нужно указать размерность массива или проинициализировать строку

Код:
char s[20];
char ss[]="stroka";
Хмм... У меня в книге написано что в данном случае char s[] компилятор сам выберет размер массива, и он выделит памяти не больше не меньше чем нужно.
JOFRIF вне форума Ответить с цитированием
Старый 23.07.2009, 03:19   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от JOFRIF Посмотреть сообщение
Адрес первого элемента? или всей области данных?(хотя трудно представить указатель(не массив указателей) который хранит нное количество адресов.



То-есть это происходит так("за занавесом")?
1)На этапе компиляции размещает в Вашей программе строку "123"(в области данных)
2)char s;
3)char *s = &s;
4)*s = "123";

p.s Извините за шквал вопросов, просто хочу разобраться с этим.
1)На этапе компиляции размещает в Вашей программе строку "123"(в области данных)
2)char *s = указатель на "123"

Цитата:
Сообщение от JOFRIF Посмотреть сообщение
Хмм... У меня в книге написано что в данном случае char s[] компилятор сам выберет размер массива, и он выделит памяти не больше не меньше чем нужно.
Всё верно, но для этого необходимо немедленно инициализировать массив:
Код:
 char s[] = "123";
Иначе компилятор не будет знать, сколько памяти зарезервировать для массива s[]
netrino вне форума Ответить с цитированием
Старый 23.07.2009, 03:53   #10
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Цитата:
Всё верно, но для этого необходимо немедленно инициализировать массив:
Код:

char s[] = "123";

Иначе компилятор не будет знать, сколько памяти зарезервировать для массива s[]
Спасибо, теперь понятно.

Но насчет этого как то не до конца понимаю
1)На этапе компиляции размещает в Вашей программе строку "123"(в области данных) - понятно.
2)char *s = указатель на "123" - Это указатель на область/сегмент памяти, или на первый элемент?
JOFRIF вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос по строкам в паскале NEMO1991 Паскаль, Turbo Pascal, PascalABC.NET 2 07.06.2009 13:14
Народ,зацените!Вопрос по строкам с++ Познающий Общие вопросы C/C++ 32 12.05.2009 20:16
вопрос по строкам CraZZy RabbIt Общие вопросы Delphi 4 21.04.2009 19:00
Вопрос по Visual Basic 6. С.М.С Помощь студентам 7 08.03.2009 13:51
Вопрос по Visual C++ TheLostOne Visual C++ 4 12.02.2009 00:23