Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: чтение из stdin  (Прочитано 23040 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« : 12-08-2008 08:27 » 

Всем привет. Я начинаю сходить с ума, никак не могу понять в чем причина. в общем имеется некая функция некоторого класса, ее задачей является прочитать из stdin ввод имени пользователя/пароля/экземпляра базы. Организовал я это вот так:

Код:
void класс::функция()
{
    char* instance,*user,*passwd;

    cout << "Enter Instance: ";
    fgets(instance, 4096, stdin);

    cout << "Enter Username: ";
    fgets(user, 4096, stdin);

    cout << "Enter Password: ";
    fgets(passwd, 4096, stdin);
...
...
...

проблема заключается в том, что указатель user и passwd имеют одинаковый адрес памяти, соответственно когда я читаю из stdin в user то автоматом получаю тоже значение и в passwd. Смотрите вложение там скрин.

З.Ы.: качество картинки плохонькое, что бы весило поменьше 94,5Кб

* scrin.jpg (94.51 Кб - загружено 1376 раз.)
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 12-08-2008 08:40 » 

Как работает fgets? Она сама выделяет память? Если да, то такого быть не должно.
Выдели сам память под эти переменные.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #2 : 12-08-2008 08:43 » 

Вот описание fgets. Она входит в stdio.h

Цитата
char * fgets ( char * str, int num, FILE * stream );

Get string from stream

Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or a the End-of-File is reached, whichever comes first.
A newline character makes fgets stop reading, but it is considered a valid character and therefore it is included in the string copied to str.
A null character is automatically appended in str after the characters read to signal the end of the C string.

Parameters

str
    Pointer to an array of chars where the string read is stored.
num
    Maximum number of characters to be read (including the final null-character). Usually, the length of the array passed as str is used.
stream
    Pointer to a FILE object that identifies the stream where characters are read from.
    To read from the standard input, stdin can be used for this parameter.

Return Value
On success, the function returns the same str parameter.
If the End-of-File is encountered and no characters have been read, the contents of str remain unchanged and a null pointer is returned.
If an error occurs, a null pointer is returned.
Use either ferror or feof to check whether an error happened or the End-of-File was reached.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #3 : 12-08-2008 09:09 » 

Разобрался. Нужно всеже инициализировать память для указателей, вот только не понятно почему? Ушел учить мат.часть. Улыбаюсь

Код:
    char* instance = new char[4096];
    char* user = new char[4096];
    char* passwd = new char[4096];
« Последнее редактирование: 12-08-2008 09:12 от McZim » Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 12-08-2008 09:18 » 

McZim, см. функцию getline - она сама выделяет память, если переданный указатель равен NULL.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #5 : 12-08-2008 09:20 » 

Есть небольшой минус у функции fgets она добавляет символ "\n", за этом нужно следить!!! Если не очень хочется можно воспользоваться функцией scanf.

Например:

Код:
char* username = new char[1024];

count << "Enter User Name: "
scanf("%s", username);
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #6 : 12-08-2008 09:24 » 

RXL, функция getline работает со строками (string& str), в моем случае char*, лишняя работа по преобразованию мне ни к чему.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 12-08-2008 09:27 » 

McZim, ошибаешься: man getline
Это функция никакого отношения к iostreams и C++ не имеет. Входит в glibc.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #8 : 12-08-2008 09:29 » 

RXL, хм странно Улыбаюсь А вот это что?

http://www.cplusplus.com/reference/string/
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 12-08-2008 09:39 » 

McZim, надо думать, что это совсем другая функция.

Кстати, не понятно, почему пользуясь iostreams ты работаешь с char*. Логично использовать родное.
« Последнее редактирование: 12-08-2008 09:41 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #10 : 12-08-2008 09:44 » new

RXL, потому что мне нужно передавать дальше в функцию именно char*
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 12-08-2008 09:48 » 

Макс, надо придерживаться чего одного. Иначе, по мере роста проекта, будут множественные труднонаходимые ошибки.

Не далее как вчера ловил багу в модуле, который без проблем работал не меньше 3 лет (его написали еще до меня). Взял модуль и осыпался - до полной неработоспособности. Проектировать надо и программить руками, а не из чурочек подпорки стругать... Это я о прошлых разработчиках.
« Последнее редактирование: 12-08-2008 09:52 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #12 : 12-08-2008 09:57 » 

RXL, согласен на 100%. Но у меня не очень большой опыт в проектировании проектов.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 12-08-2008 10:00 » 

McZim, никогда не вредно учиться. Стоит читать коды больших GPL-проектов (если форматирование кода плохое - можно не читать - 90%, что проект с ошибками), разбираться в приемах.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines