Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
ylyas
Зарегистрирован: 19.04.2007 Сообщения: 8
|
Добавлено: Чт Апр 19 2007 11:59 Заголовок сообщения: Помогите новичку в С++ !? |
|
|
пытаююсь получить длину строки вводимой пользователем:
char *s1;
const char *s2;
gets(s1);
s2 = s1;
unsigned kol = strlen(s2);
retutrn 0;
в результате , после ввода строки вызывается исключение
"...............Access Violation at address 32661f69.
Write of address 00000001"
Подскажите что я не так сделал??? |
|
Вернуться к началу |
|
|
Штирка
Зарегистрирован: 07.05.2003 Сообщения: 132 Откуда: Новосибирская область
|
Добавлено: Чт Апр 19 2007 16:05 Заголовок сообщения: Re: Помогите новичку в С++ !? |
|
|
Советую разобраться с ссылками и указателями на память (pointers и references) и как с ними работать. По моему, правильный код будет что то вроде gets(&s1);
ylyas писал(а): | пытаююсь получить длину строки вводимой пользователем:
char *s1;
const char *s2;
|
ylyas писал(а): |
gets(s1);
s2 = s1;
|
А чего вы хотите добиться s2=s1? Присвоения адреса или присвоения значения, хранящегося по адресу? И почему у вас s2 задекларировано константой если вы пытаетесь присваивоить ему значение?
ylyas писал(а): |
unsigned kol = strlen(s2);
retutrn 0;
в результате , после ввода строки вызывается исключение
"...............Access Violation at address 32661f69.
Write of address 00000001"
Подскажите что я не так сделал??? |
|
|
Вернуться к началу |
|
|
ylyas
Зарегистрирован: 19.04.2007 Сообщения: 8
|
Добавлено: Чт Апр 19 2007 16:20 Заголовок сообщения: |
|
|
нет все гораздо проще.
Проблему решил самостоятельно , код весь верен, суть не в том,
символьная константа нужна лишь для того чтобы правильно передать параметр в функцию strlen(const char *s)
здесь возникает следующая неоднозначность:
char *s1 -это не что иное как указатель на символьный массив, но вероятно система его инициализирует каким то небольшим значением элементов, поэтому , как наиболее предпочтительное описание символьной строки будет char s[100].
Иначе рискуем залезть в чужую область с данными |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Пт Апр 20 2007 17:24 Заголовок сообщения: Теория флогистона тоже объясняет многие факты |
|
|
ylyas писал(а): | здесь возникает следующая неоднозначность:
char *s1 -это не что иное как указатель на символьный массив, но вероятно система его инициализирует каким то небольшим значением элементов, поэтому , как наиболее предпочтительное описание символьной строки будет char s[100].
Иначе рискуем залезть в чужую область с данными | Почти правильно. Правильно примерно на 0%.
На самом деле система ничем его (char *s1) не инициализирует, потому что система выполняет то, что ей сказано, а ей сказано "char *s1" -- по-русски это значит "выдели программе столько памяти, сколько предусмотрено для указателей, и считай, что в этой памяти находится адрес односимвольного объекта". (Точнее она инициализирует его в соответствии со своими внутренними правилами, вероятней всего, значением 0x0 -- nil в паскально-дельфийском простонародье. Но для программиста то, чем система в действительности инициализирует выделяемую память, -- тайна за мульёном копирайтов.) Вот компилятор и выделяет эту память, а что в этой памяти записано, его не интересует, так как ему (компилятору) ничего об этом не сказано. А второй вариант решает задачу потому, что когда сказано "char s[100]" -- это по-русски значит "выдели программе столько памяти, сколько предусмотрено для 100 односимвольных объектов, а далее вместо s всегда подставляй адрес первого из этих объектов".
Именно поэтому в первом случае никогда неизвестно, что за адрес будет в s1 (и почти со 100%-ной вероятностью это будет не адресом участка памяти, который был выделен программе для её нужд, а адресом, который ОС использует для своих нужд. ), а во втором известно -- адрес участка памяти, который был специально выделен программе для её нужд.
--------------------------
Теория флогистона тоже объясняет многие факты |
|
Вернуться к началу |
|
|
ylyas
Зарегистрирован: 19.04.2007 Сообщения: 8
|
Добавлено: Пн Апр 23 2007 08:40 Заголовок сообщения: |
|
|
благодарю за вразумление ))
Тогда что будет являться альтернативой для ввод строки неопределенной длины? Тип String ? или как можно иначе? |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пн Апр 23 2007 08:57 Заголовок сообщения: |
|
|
ylyas писал(а): | Тип String ? |
Тип String ! |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Пн Апр 23 2007 09:12 Заголовок сообщения: Работать должны машины -- люди должны думать (c) IBM |
|
|
ylyas писал(а): | Тогда что будет являться альтернативой для ввод строки неопределенной длины? Тип String ? или как можно иначе? |
На сегодня, как мне представляется, придуман только один способ (при нескольких вариантах оформления этого способа) -- после каждого введённого символа проверять достижение конца буфера, и если достижение конца буфера имеет место, то выделение дополнительного буфера. Эти соображения имеет смысл повесить на автомат, то есть создать класс по вводу символьной строки неопределённой длины. Наверняка кто-то уже такое сделал, хотя действительное применение строк действительно неопределённой длины, вообще говоря, вызывает действительное сомнение, так как в программировании как сферы деятельности речь идёт об обработке структурированной информации -- неструктурированную информацию по определению бессмысленно обрабатывать автоматически, -- поэтому вводить информацию неопределённой длины нет смысла. Единственный случай, когда нужно ввести строку действительно неопределённой длины, -- это просто сообщить, что есть такая информация. Фактически это случай, когда получателю этой информации предлагается самому отструктурировать её (это и есть случай текстового редактора).
Тип string, вообще говоря, имеет ограничения, хотя для практических задач -- эти ограничения, видимо, недостижимы
----------------------------
Работать должны машины -- люди должны думать (c) IBM |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пн Апр 23 2007 10:20 Заголовок сообщения: |
|
|
Если вернуться к вопросу, то посоветую просто немного изменить код.
Код: |
char *s1;
gets(s1);
const char *s2 = s1;
unsigned kol = strlen(s2);
retutrn 0;
|
Теперь должно работать без траблов. Хотя ничего страшного не будет, если ты не будешь создавать s2 и напишешь strlen(s1). Пусть даже s1 не является константой. |
|
Вернуться к началу |
|
|
ylyas
Зарегистрирован: 19.04.2007 Сообщения: 8
|
Добавлено: Пн Апр 23 2007 11:57 Заголовок сообщения: |
|
|
еще раз благодарю за разъяснения.
Опробовал предолженный вами код, как я и предполагал положительного результата он не принес, программа завершается с прежней ошибкой, которая возникает уже на этапе
выполнения функциии gets(s1). |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пн Апр 23 2007 13:08 Заголовок сообщения: |
|
|
char *s1 = new char[255];
gets(s1); |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
|
Вернуться к началу |
|
|
TomSoyer
Зарегистрирован: 16.04.2007 Сообщения: 4
|
Добавлено: Ср Май 02 2007 09:42 Заголовок сообщения: |
|
|
Код: |
char *s1;
const char *s2;
gets(s1);
s2 = s1;
unsigned kol = strlen(s2);
retutrn 0;
|
В данном случае s1 и s2 всего лишь переменные для хранения адреса строки, коей в программе и вовсе нет. Операция gets(s1); вызывает ошибку обращения к памяти, т.к. s1 не содержит адреса рабочей области и считывать данные НЕКУДА! как было сказано выше надобно выделить память и присвоить переменной s1 адрес её начала, примерно так: s1=new char[255];
операция s2=s1; не выделяет новой памяти а указывает на расположение той-же области памяти что и s1, поэтому операция strlen(s2) так-же не принесёт результата. Для ознакомления с базовыми знаниями С/С++ прочти книгу Керниган, Ричи - Язык С. раздел 5. Указатели и массивы. см. ссылку: http://kozhuhovo.org/cgi-bin/html-KOI.pl/CTOTOR/
А вообще программ без ошибок не бывает. Все с этого начинали. |
|
Вернуться к началу |
|
|
|