Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> На пути познания, изучая С++ возникает масса вопросов 
:(
    Опции темы
Vendigo
Дата 13.1.2006, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 25.9.2005
Где: Челябинская обл. г. Миасс

Репутация: нет
Всего: нет



Чем спамить в разных темах решил создать свою, где и буду озвучивать все те вопросы которые возникают у меня при изучении этого языка.
Добавлено @ 18:34
Для начала сугубо конкретный вопрос. Помогите найти ошибку.

У меня есть структура:
Код

struct Data_list
    {
    char name[64];        
    int birthday;        
    char addres[64];      
    int telephone;        
    char nik[32];        
    char sex;            
    char company[32];     
    char note[1024];     
    };

И функция которая вводит данные в структуру:
Код

void input()
{
    int a = 1;
    do
        {
        int i;
        for(i = 0; i < Size; i++)
            if(Data_book[i].name[0] == '\0') break;    // Ищем пустую строку
        if(i == Size)                                                   // Если цикл прошел весь
            {                                                               // пустых строк нет
            cout << "no memory\n";
            return;
            }

        cout << "\ninput name: ";         //Вводим данные
        gets(Data_book[i].name);
        cout << "\ninput addres: ";
        gets(Data_book[i].addres);
        cout << "\ninput birthday(19791001): ";
        cin >> Data_book[i].birthday ;
        cout << "\ninput telephone: ";
        cin >> Data_book[i].telephone;

        cout << "\nREPET? (Yes-1/No-0)";             // Запрос повторного ввода
        cin >> a;
        } while(a);                                                 //Повтор ввода при необходимости
}

Функция gets() работает неправильно, срабатывает только второй вызов этой функции. Если использовать оператор cin >> то все работает нормально.

Насколько я понимаю в функцию gets() в качестве параметра нужно передать имя символьного массива (эдакую строку) без индекса. Имя символьного массива без индекса в свою очередь трактуется в С++ как указатель на его первый [0] элемент.

Разве член структуры Data_book[i].name не соответствует этому определению?

PM MAIL   Вверх
Partizan
Дата 13.1.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



Во первых какую размерность имеет Data_book???
упс smile

Это сообщение отредактировал(а) Partizan - 13.1.2006, 18:50


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
_hunter
Дата 13.1.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



в смысле "рабатывает только второй вызов этой функции"?
в чем это выражается?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Void
Дата 13.1.2006, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Проблема проявляется из-за того, что оператор >> оставляет в потоке '\n', gets читает его и тут же завершается. Можно убедиться на следующем примере:
Код
#include <iostream>
#include <cstdio>

int main() {
    char buf[64];
    std::cin >> buf;
    std::gets(buf);
    std::cout << buf;
}

Лечение простое:
Код
std::cin >> buf >> std::ws;

Манипулятор ws поскипает пробелы и служебные символы.

Да, и еще: мешать потоки и C stdio - плохая затея. Вместо gets воспользуйся лучше cin.getline:
Код
cin.getline(Databook[i].name, sizeof(Databook[i].name));



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
bilbobagginz
Дата 13.1.2006, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 3
Всего: 317



и вообще КТО ЭТОТ Data_book ?! smile
где он объявлен ? smile

какого черту далась тебе эта функция в инструкции которой написано:
НЕ ИСПОЛЬЗУЙТЕ ЭТУ ФУНКЦИЮ.

?



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
blackofe
Дата 13.1.2006, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(bilbobagginz @ 13.1.2006, 20:38)
какого черту далась тебе эта функция в инструкции которой написано:
НЕ ИСПОЛЬЗУЙТЕ ЭТУ ФУНКЦИЮ.

оффтоп, но вспомнилось просто из spaceballs: там в звездолете кнопка большая и красная: "аварийная остановка. ни в коем случае не нажимать!" smile
PM MAIL   Вверх
Vendigo
Дата 13.1.2006, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 25.9.2005
Где: Челябинская обл. г. Миасс

Репутация: нет
Всего: нет



Привет!
Спасибо за оперативность. Я понял... что я почти ничего не понял. Я еще не знаю что такое потоки.
Разбирался с структурами и составил эту учебную программку.

2 bilbobagginz Вот Data_book:
Код

const int Size = 256;
Data_list Data_book[Size];

Цитата(bilbobagginz @ 13.1.2006, 20:38 Найти цитируемый пост)

какого черту далась тебе эта функция в инструкции которой написано:
НЕ ИСПОЛЬЗУЙТЕ ЭТУ ФУНКЦИЮ.


Ты имеешь ввиду gets()? Не знал, что ее нельзя использовать smile


PM MAIL   Вверх
Void
Дата 13.1.2006, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Vendigo @ 13.1.2006, 23:25 Найти цитируемый пост)
Я еще не знаю что такое потоки.

cin/cout - это стандартные потоки ввода-вывода.

Цитата(Vendigo @ 13.1.2006, 23:25 Найти цитируемый пост)
Ты имеешь ввиду gets()? Не знал, что ее нельзя использовать

Эта функция не проверяет, не выходят ли введенные данные за пределы выделенного буфера. Поэтому ее категорически не рекомендуется использовать. Вместо нее следует применять fgets или istream::getline.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
blackofe
Дата 13.1.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(Void @ 13.1.2006, 21:28)
Эта функция не проверяет, не выходят ли введенные данные за пределы выделенного буфера. Поэтому ее категорически не рекомендуется использовать. Вместо нее следует применять fgets или istream::getline.

я со всем согласен, но напрашиваются параллели. ведь char a[20] тоже нельзя использовать - потому что легко можно выйти за пределы строки. и какой-нибудь strcat() тоже нельзя использовать. а указатели совершенно не рекомендуется использовать - мало ли что с их помощью можно натворить! а уж new - просто под замок - потому что сплошь и рядом забывают вызывать ответный delete.

вывод: не программируйте, други мои. это опасно для жизни.

ни в коем случае не наезд и не попытка растления неопытных. но согласитесь, логика таки в моих словах есть. smile
PM MAIL   Вверх
Void
Дата 13.1.2006, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(blackofe @ 14.1.2006, 00:22 Найти цитируемый пост)
вывод: не программируйте, други мои. это опасно для жизни.

Из вышесказанного, ИМХО, следует несколько иной вывод: не программируйте на C++ - это опасно для жизни. smile
Прошу не воспринимать как призыв к холивару - просто настроение у меня такое smile

Цитата(blackofe @ 14.1.2006, 00:22 Найти цитируемый пост)
логика таки в моих словах есть.

Дао, высказанное словами, не есть Дао. smile

Так что, действительно, давайте не будем растлевать малолетних smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
blackofe
Дата 13.1.2006, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(Void @ 13.1.2006, 22:28)
Так что, действительно, давайте не будем растлевать малолетних smile

deal smile

а настроение, действительно, того.. только клопов давить под такое настроение smile
PM MAIL   Вверх
dronzo
Дата 13.1.2006, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 26.11.2005
Где: Москва

Репутация: 1
Всего: 8



Цитата(Void @ 13.1.2006, 22:28)
Из вышесказанного, ИМХО, следует несколько иной вывод: не программируйте на C++ - это опасно для жизни. smile
Прошу не воспринимать как призыв к холивару - просто настроение у меня такое.

Void, Это не холивар, это ты Страуструпа цитируешь : "Программируя на С вы легко можете прострелить себе ногу, программируя на С++ - это сделать сложнее, но если вы это сделаете, то вам оторвёт ногу целиком".
smile


PM MAIL   Вверх
Void
Дата 13.1.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



dronzo
Так и быть, спрячусь за Мастера smile Хотя смысл все-таки отличается.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
DrLazy
Дата 14.1.2006, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 8.7.2005

Репутация: нет
Всего: нет



dronzo
Вывод, не цельтесь себе в ногу, даже в шутку smile

PM   Вверх
Vendigo
Дата 17.1.2006, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 25.9.2005
Где: Челябинская обл. г. Миасс

Репутация: нет
Всего: нет



Привет всем, это опять я. Изучение продвигается, сейчас я осваиваю классы. Предыдущий пример со структурой я переписал в виде класса:
Код

class Data_list
{
    char name[64];        // Имя
    int birthday;         // День рождения год.месяц.число
    char address[64];     // Адресс
    int telephone;        // Телефон
    char nik[32];         // Ник
    char sex;             // Пол m/w/n
    char company[32];     // Место работы
    char note[1024];      // Заметки
public:
    Data_list();                    // Конструктор

    void clear();                   // Очистка данных

    int name_put(char *str);        // Ввод данных
    int birthday_put(int a);
    int address_put(char *str);
    int telephone_put(int a);
    int nik_put(char *str);
    int sex_put(char s);
    int company_put(char *str);
    int note_put(char *str);

    char    *name_get();                         // Получение данных
    int     birthday_get();
    char    *address_get();
    int     telephone_get();
    char    *nik_get();
    char    sex_get();
    char    *company_get();
    char    *note_get();

};


Создал массив объектов:
Код

const int size_list = 100;
Data_list man[size_list];


Но опять таки все уперлось в получение строки из консоли. Void пишет, что можно использовать fgets() (вместо gets() которая не работает).

Нашел её прототип в справке:
char *fgets(char *s, int n, FILE *stream);
Объясните параметр FILE *stream, про потоки я еще ничего не знаю, так что... помогите.


PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0920 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.