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

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

Восстановить пароль Регистрация
 
zabuka
 Аватар для zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
25.02.2011, 22:21     Массив строк #1
Добрый вечер! Решая задачу из главы 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++
Запросить название учебного заведения, специальность и номер группы. записав их в массив из 3 строк. Подсчитать длины каждой строк C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vandris
 Аватар для Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 90
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
 Аватар для 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
 Аватар для Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 90
26.02.2011, 08:07     Массив строк #4
Не работает.
стоит ли мне говорить, что у меня работает?

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

P.S. у меня компилятор gcc 4.5.1, у вас как вижу MSVS
Миниатюры
Массив строк  
zabuka
 Аватар для 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
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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
 Аватар для 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++
 Аватар для asics
2838 / 1775 / 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++ Вводится массив строк текста с неизвестным заранее количеством строк
Переписать массив строк из файла в двумерный массив типа CHAR C++! C++

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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     Массив строк
Ответ Создать тему
Опции темы

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