Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Помогите новичку в С++ !?

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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"

Подскажите что я не так сделал???
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Yahoo Messenger
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
Откуда: откуда все люди родятся

СообщениеДобавлено: Пн Апр 23 2007 13:09    Заголовок сообщения: Ответить с цитатой

...или даже так:

char s1[255];
gets(s1);

http://msdn2.microsoft.com/en-us/library/2029ea5f(vs.71).aspx
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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/
А вообще программ без ошибок не бывает. Все с этого начинали.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...