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

Из scanf в std::cin - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
14.12.2010, 13:14     Из scanf в std::cin #1
Как тоже самое сделать с помощью std::cin?
C++
1
2
3
         printf("Введите автора %d книги.\n",i+1);
        scanf("%31s ",ar[i].author);
        fflush(stdin);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2010, 13:14     Из scanf в std::cin
Посмотрите здесь:

C++ Операторы cin и scanf
C++ какая разница между cin и scanf?
C++ scanf и printf или cin и cout
C++ Не работает std::cout || std::cin
Cin и cout заменить на scanf и printf C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
14.12.2010, 13:19     Из scanf в std::cin #2
Если не ошыбаюсь, как-то так
C++
1
2
3
std::cout << "Введите автора" << i + 1 << " книги." << std::endl;
                std::cin >> ar[i].author;
                std::cin.clear();
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
14.12.2010, 13:23  [ТС]     Из scanf в std::cin #3
asics, интересует конкретно вот это
C++
1
"%31s "
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
14.12.2010, 13:26     Из scanf в std::cin #4
C++
1
std::cin.getline(ar[i].author, 31);
Так ?
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
14.12.2010, 15:50  [ТС]     Из scanf в std::cin #5
Есть программа:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <tchar.h>
#include <iostream>
#include <cmath>
//#include <cstdio>
//#include "other.h"
 
 
using namespace std;
 
#define SIZE 32
#define   stop __asm nop
 
struct BOOK
{
    char author[SIZE];
    char title[SIZE];
    char category[SIZE];
    double price;
    int year;
    
};
 
BOOK globalBook;
 
int _tmain()
{
  setlocale( LC_ALL,"Russian" );
    BOOK localBook;
    static BOOK statBook;
    BOOK*dinBook= new BOOK;
stop
 
    
    BOOK *ar[]={&statBook,dinBook,&globalBook,&localBook};
    cout<<"\n\nСтруктуры. Задание 3"<<endl;
    const char *strBook[]={"автора","название","категорию","цену","год издания"};
    for(int j=0;j<4;j++)
    {
        for(int i=0;i<5;i++)
        {
            cout<<"Введите "<<strBook[i]<<" книги."<<endl;
            switch(i)
            {
            case 0:
                
                cin.getline(ar[j]->author,31);
                cin.clear();break;
            case 1:
                cin.getline(ar[j]->title,31);
                cin.clear();break;
            case 2:
                cin.getline(ar[j]->category,31);
                cin.clear();break;
            case 3:
                cin>>ar[j]->price;
                cin.clear();break;
            case 4:
                cin>>ar[j]->year;
                cin.clear();break;
            }
        }
    }
    return 0;
}
начиная со второй книги, не вводит автора. Просто проскакивает мимо.
В чем причина?
Миниатюры
Из scanf в std::cin  
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
14.12.2010, 19:25  [ТС]     Из scanf в std::cin #6
актуально
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
14.12.2010, 19:45     Из scanf в std::cin #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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <tchar.h>
#include <iostream>
#include <cmath>
//#include <cstdio>
//#include "other.h"
 
 
using namespace std;
 
#define SIZE 32
#define   stop __asm nop
 
struct BOOK
{
        char author[SIZE];
        char title[SIZE];
        char category[SIZE];
        double price;
        int year;
 
};
 
BOOK globalBook;
 
int _tmain()
{
  setlocale( LC_ALL,"Russian" );
        BOOK localBook;
        static BOOK statBook;
        BOOK*dinBook= new BOOK;
 
 
        BOOK *ar[]={&statBook,dinBook,&globalBook,&localBook};
       // cout<<"\n\nСтруктуры. Задание 3"<<endl;
        const char *strBook[]={"avtora","nazvanie","katehoriu","ceny","hod izdanie"};
        for(int j=0;j<4;j++)
        {
                for(int i=0;i<5;i++)
                {
                        cout<<"vvedite "<<strBook[i]<<" knuhu."<<endl;
                        switch(i)
                        {
                        case 0:
 
                                cin.getline(ar[j]->author,31);
                                cin.ignore();
                                cin.clear();
                                break;
                        case 1:
                                cin.getline(ar[j]->title,31);
                                cin.clear();
                                cin.ignore();
                                break;
                        case 2:
                                cin.getline(ar[j]->category,31);
                                cin.clear();
                                cin.ignore();
                                break;
                        case 3:
                                cin>>ar[j]->price;
                                cin.clear();
                                cin.ignore();
                                break;
                        case 4:
                                cin>>ar[j]->year;
                                cin.clear();
                                cin.ignore();
                                break;
                        }
                }
        }
        return 0;
}
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
14.12.2010, 20:08  [ТС]     Из scanf в std::cin #8
asics,
Так работает
и даже с русским языком
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <tchar.h>
#include <iostream>
#include <cmath>
//#include <cstdio>
//#include "other.h"
 
 
using namespace std;
 
#define SIZE 32
#define   stop __asm nop
 
struct BOOK
{
        char author[SIZE];
        char title[SIZE];
        char category[SIZE];
        double price;
        int year;
        
};
 
BOOK globalBook;
 
int _tmain()
{
  setlocale( LC_ALL,"Russian" );
        BOOK localBook;
        static BOOK statBook;
        BOOK*dinBook= new BOOK;
stop
 
        
        BOOK *ar[]={&statBook,dinBook,&globalBook,&localBook};
        cout<<"\n\nСтруктуры. Задание 3"<<endl;
        const char *strBook[]={"автора","название","категорию","цену","год издания"};
        for(int j=0;j<4;j++)
        {
                for(int i=0;i<5;i++)
                {
                        cout<<"Введите "<<strBook[i]<<" книги."<<endl;
                        switch(i)
                        {
                        case 0:
                                
                                cin.getline(ar[j]->author,31);
                                cin.ignore();
                cin.clear();
                break;
                        case 1:
                                cin.getline(ar[j]->title,31);
                                cin.clear();
                cin.ignore();break;
                        case 2:
                                cin.getline(ar[j]->category,31);
                                cin.clear();
                cin.ignore();break;
                        case 3:
                                cin>>ar[j]->price;
                                cin.clear();
                cin.ignore();break;
                        case 4:
                                cin>>ar[j]->year;
                                cin.clear();
                cin.ignore();break;
                        }
                }
        }
        return 0;
}

Одно неудобство - два раза Enter приходиться нажимать. Можно как то исправить?
Можете объяснить, почему автора во всех последующих книгах не удавалось ввести и каким образом cin.ignore() это исправляет?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
14.12.2010, 20:20     Из scanf в std::cin #9
Цитата Сообщение от st_dent Посмотреть сообщение
Одно неудобство - два раза Enter приходиться нажимать. Можно как то исправить?
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <tchar.h>
#include <iostream>
#include <cmath>
//#include <cstdio>
//#include "other.h"
 
 
using namespace std;
 
#define SIZE 32
#define   stop __asm nop
 
struct BOOK
{
        char author[SIZE];
        char title[SIZE];
        char category[SIZE];
        double price;
        int year;
 
};
 
BOOK globalBook;
 
int _tmain()
{
  setlocale( LC_ALL,"Russian" );
        BOOK localBook;
        static BOOK statBook;
        BOOK*dinBook= new BOOK;
 
 
        BOOK *ar[]={&statBook,dinBook,&globalBook,&localBook};
        //cout<<"\n\nСтруктуры. Задание 3"<<endl;
        const char *strBook[]={"avtora","nazvanie","katehoriu","ceny","hod izdanie"};
        for(int j=0;j<4;j++)
        {
                for(int i=0;i<5;i++)
                {
                        cout<<"vvedite "<<strBook[i]<<" knuhu."<<endl;
                        switch(i)
                        {
                        case 0:
 
                                cin.getline(ar[j]->author,31);
                                cin.sync();
                                break;
                        case 1:
                                cin.getline(ar[j]->title,31);
                                cin.sync();
                                break;
                        case 2:
                                cin.getline(ar[j]->category,31);
                                cin.sync();
                                
                                break;
                        case 3:
                                cin>>ar[j]->price;
                                cin.sync();
                                break;
                        case 4:
                                cin>>ar[j]->year;
                                cin.sync();
                                break;
                        }
                }
        }
        return 0;
}
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
14.12.2010, 20:36  [ТС]     Из scanf в std::cin #10
asics,
всё-таки работает
вот так
. А то при переполнении массива - вылетает.
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
 case 0:
                                
                                cin.getline(ar[j]->author,31);
                cin.sync();
                cin.clear();
                break;
                        case 1:
                                cin.getline(ar[j]->title,31);
                                cin.sync();
                cin.clear();
                break;
                        case 2:
                                cin.getline(ar[j]->category,31);
                cin.sync();
                cin.clear();
                break;
                        case 3:
                                cin>>ar[j]->price;
                cin.sync();
                cin.clear();
                break;
                        case 4:
                                cin>>ar[j]->year;
                cin.ignore();
                cin.clear();
                break;

а как с этим?
Можете объяснить, почему автора во всех последующих книгах не удавалось ввести и каким образом cin.ignore() это исправляет?
и что нам дала cin.sync()?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
14.12.2010, 20:43     Из scanf в std::cin #11
st_dent, cin.sync() - очищение буфера стандартного ввода.
Остальное тут или тут.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2010, 20:06     Из scanf в std::cin
Еще ссылки по теме:

Переделать scanf, printf в cin, cout C++
C++ Scanf vs cin (double variant)
Ограничение на ввод символов scanf() и cin C++

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

Или воспользуйтесь поиском по форуму:
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
19.12.2010, 20:06     Из scanf в std::cin #12
Цитата Сообщение от st_dent Посмотреть сообщение
интересует конкретно вот это
C++
1
"%31s "
C++
1
2
3
#include <iomanip>
//...
std::cin >> std::setw(SIZE) >> ar[i].author;
Yandex
Объявления
19.12.2010, 20:06     Из scanf в std::cin
Ответ Создать тему
Опции темы

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