Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

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

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

skype: vvviperrr00
По умолчанию

смотря где и когда что использовать.
char *s = "123"; - указатель на константную строку (изменить ее будет нельзя).
string s; - класс строки. удобно использовать конкатенацию, поиск и тп, но к примеру, в файл ты такой тип строки просто так не запишешь, надо делать сериализацию (в любой момент можно получить СИ строку методом c_str())
char s[] - строка, представлена ввиде массива. грубо говоря, то же самое, что и первый вариант, только данные можно изменить
pproger вне форума   Ответить с цитированием
Старый 23.07.2009, 01:32   #3
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Адрес: 0x1000
Сообщений: 147
Репутация: 37
По умолчанию

Цитата:
в файл ты такой тип строки просто так не запишешь, надо делать сериализацию (в любой момент можно получить СИ строку методом 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
Репутация: 736
По умолчанию

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

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

Если с файлами работать, то имхо лучше память динамически выделять. То есть:
Код:
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
Репутация: 431
По умолчанию

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

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

Цитата:
Строка помещается в память и адрес присваивается указателю 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
Адрес: 0x1000
Сообщений: 147
Репутация: 37
По умолчанию

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

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

Цитата:
Сообщение от 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
Адрес: 0x1000
Сообщений: 147
Репутация: 37
По умолчанию

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

char s[] = "123";

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос по строкам в паскале NEMO1991 Паскаль 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 14:51
Вопрос по Visual C++ TheLostOne Visual C++ 4 12.02.2009 01:23


05:29.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.