McZim
|
|
« : 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Кб
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #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
|
|
« Ответ #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
Пол:
|
|
« Ответ #4 : 12-08-2008 09:18 » |
|
McZim, см. функцию getline - она сама выделяет память, если переданный указатель равен NULL.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #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
|
|
« Ответ #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
Пол:
|
|
« Ответ #7 : 12-08-2008 09:27 » |
|
McZim, ошибаешься: man getline Это функция никакого отношения к iostreams и C++ не имеет. Входит в glibc.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #8 : 12-08-2008 09:29 » |
|
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #9 : 12-08-2008 09:39 » |
|
McZim, надо думать, что это совсем другая функция.
Кстати, не понятно, почему пользуясь iostreams ты работаешь с char*. Логично использовать родное.
|
|
« Последнее редактирование: 12-08-2008 09:41 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #10 : 12-08-2008 09:44 » |
|
RXL, потому что мне нужно передавать дальше в функцию именно char*
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #11 : 12-08-2008 09:48 » |
|
Макс, надо придерживаться чего одного. Иначе, по мере роста проекта, будут множественные труднонаходимые ошибки.
Не далее как вчера ловил багу в модуле, который без проблем работал не меньше 3 лет (его написали еще до меня). Взял модуль и осыпался - до полной неработоспособности. Проектировать надо и программить руками, а не из чурочек подпорки стругать... Это я о прошлых разработчиках.
|
|
« Последнее редактирование: 12-08-2008 09:52 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #12 : 12-08-2008 09:57 » |
|
RXL, согласен на 100%. Но у меня не очень большой опыт в проектировании проектов.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #13 : 12-08-2008 10:00 » |
|
McZim, никогда не вредно учиться. Стоит читать коды больших GPL-проектов (если форматирование кода плохое - можно не читать - 90%, что проект с ошибками), разбираться в приемах.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|