Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
#1

Массив строк - C++

25.02.2011, 22:21. Просмотров 494. Ответов 8
Метки нет (Все метки)

Добрый вечер! Решая задачу из главы 7, книги Лафоре, столкнулся с неправильной работой программы, второй и последующие параметры, при вводе строки, пропускаются:
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//////////////////////////////////////////////////////////////////////////////////////////////////
class employee
{
private:
    string name;                    // строка
    long num;                       // число
public:
    employee() : name(), num(0)     // конструктор без аргументов
    { }         
    void getData()                  // ввод значений пользователем
    {
        cout << "\n   Введите имя и фамилию: ";
        getline(cin, name);
        cout << "   Введите табельный номер работника: ";
        cin >> num;
    }
    void putData()                  // возврат введеных значений
    {
        cout << "\n   Должность: " << name << endl;
        cout << "   Табельный номер: " << num << endl;
    }
};
//////////////////////////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    employee s1 [100];              // массиы из 100 значений
    int n = 0;                      // вспомагательная переменная
    char answer;                    // ответ для продолжения цикла
    do                              // цикл для ввода значений
    {
        cout << "Введите параметры сотрудника: " << n + 1;
        s1[n++].getData();          // изменяем вручную переменную для цикла
        cout << "Продолжить ввод (y/n)? ";
        cin >> answer;
    } while(answer != 'n');         // для продолжения цикла
    for(int i = 0; i < n; i++)
    {
        cout << "\nСотрудник " << i + 1 << ": "; 
        s1[i].putData();
    }
    system("PAUSE");
    return 0;
}
Посмотрел решение, аналогичное моему.

Добавлено через 1 час 5 минут
Я так понимаю идей нет ни у кого...
Миниатюры
Массив строк  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2011, 22:21     Массив строк
Посмотрите здесь:

массив строк C++
массив строк C++
C++ Массив строк
C++ Массив строк
Массив строк C++
Массив строк... C++
C++ массив строк
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 92
25.02.2011, 22:34     Массив строк #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <cstdio>
......                                // ответ для продолжения цикла
    do                                                              // цикл для ввода значений
    {
        cout << "Введите параметры сотрудника: " << n + 1;
        s1[n++].getData();                      // изменяем вручную переменную для цикла
        cout << "Продолжить ввод (y/n)? ";
        cin >> answer;
        fflush(stdin);
    }
    while(answer != 'n');                   // для продолжения цикла
}
zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
26.02.2011, 00:56  [ТС]     Массив строк #3
Цитата Сообщение от Vandris Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
#include <cstdio>
    do                                                              // цикл для ввода значений
    {
        ............
        fflush(stdin);
    }
    while(answer != 'n');                   // для продолжения цикла
}
Не работает.
Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 92
26.02.2011, 08:07     Массив строк #4
Не работает.
стоит ли мне говорить, что у меня работает?

а что у вас конкретно: ошибка или все тоже самое, как и без изменений?

P.S. у меня компилятор gcc 4.5.1, у вас как вижу MSVS
Миниатюры
Массив строк  
zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
26.02.2011, 11:13  [ТС]     Массив строк #5
Цитата Сообщение от Vandris Посмотреть сообщение
стоит ли мне говорить, что у меня работает?
http://picsave.ru/images/00001.jpg

а что у вас конкретно: ошибка или все тоже самое, как и без изменений?

P.S. у меня компилятор gcc 4.5.1, у вас как вижу MSVS
Да, все без изменения. Компилятор MSVS.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.02.2011, 11:38     Массив строк #6
Попробуйте так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
do
{
    // очистка istream
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());        
 
    cout << "Введите параметры сотрудника: " << n + 1;
    s1[n++].getData();
    cout << "Продолжить ввод (y/n)? ";
    cin >> answer;
 
} while(answer != 'n');
zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
26.02.2011, 12:24  [ТС]     Массив строк #7
Цитата Сообщение от fasked Посмотреть сообщение
Попробуйте так:
C++
1
2
3
4
5
6
do
{
    // очистка istream
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());    
} while(answer != 'n');
Спасибо большое!

Вы можете объяснить, пожалуйста, эти функции.
asics
Freelance
Эксперт C++
2844 / 1781 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
26.02.2011, 12:31     Массив строк #8
fasked, Так вроде и одного
C++
1
cin.sync()
перед
C++
1
getline(cin, name);
хватит, или я ошибаюсь ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2011, 12:42     Массив строк
Еще ссылки по теме:

массив строк C++
C++ Массив строк
массив строк C++
массив строк с++ C++
C++ Массив строк в с++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.02.2011, 12:42     Массив строк #9
Цитата Сообщение от zabuka Посмотреть сообщение
Вы можете объяснить, пожалуйста, эти функции.
Суть проблемы в том, что после ввода строки и нажати клавиши "Enter" во стандартном потоке ввода (stdin - cin) остаются некоторые символы (типа разрыва строки и так далее). Решение проблемы заключается в том, чтобы очистить входящий поток или проигнорировать лежащие в нем символы.

Описание istream

ignore
Извлечь символы (или пропустить): Извлекает (пропускает) n символов из потока.
ignore ( streamsize n = 1, int delim = EOF );

rdbuf
указатель на буфер потока: указатель на связанный (ассоциированный) объект streambuf. Он может быть получен/изменен вызовом функции rdbuf.

streambuf
базовый класс буфера для потоков
Объект streambuf отвечают за выполнение чтения и записи в/из некоторые типы символьных последовательностей, такие как внешние файлы или строки (std::string).
in_avail - input function (get). Позволяет получить количество символов, доступных в настоящий момент для чтения (то есть количество символов, которые уже есть в буфере).

В итоге получаем, что
C++
1
cin.ignore(cin.rdbuf()->in_avail())
означает извлечь (пропустить) столько символов из стандартного потока ввода, сколько в нем уже есть.

Цитата Сообщение от asics Посмотреть сообщение
хватит, или я ошибаюсь ?
да, так тоже можно
Yandex
Объявления
26.02.2011, 12:42     Массив строк
Ответ Создать тему
Опции темы

Текущее время: 09:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru