Как вводить строку и двойной тип данных в этой программе? - PullRequest
0 голосов
/ 29 марта 2020

Я изучал понятия указателей, и, как только я подумал, что получил свои понятия, эта программа доставила мне затруднения с пониманием того, как входы различных типов данных хранятся в программе.

А потом я узнал о cin.ignore() и протестировал его ..

Входы

32 // int
64.212 // float
4.76545 // double
* // char
Hey look at me! I know pointers! // string

Первая программа без cin.ignore ():

#include<iostream>
#include<string>

using namespace std;
int main()
{
    int givenInt;
    float givenFloat;
    double givenDouble ;
    std::string givenString;
    char givenChar;

    cin>>givenInt;
    cin>>givenFloat;
    cin>>givenDouble;
    cin>>givenChar;
    getline(cin,givenString);

    cout<<"givenInt = "<<givenInt<<'\n';
    cout<<"address of givenInt = "<<&givenInt<<'\n';

    cout<<"givenFloat = "<<givenFloat<<'\n';
    cout<<"address of givenFloat = "<<&givenFloat<<'\n';

    cout<<"givenDouble = "<<givenDouble<<'\n';
    cout<<"address of givenDouble = "<<&givenDouble<<'\n';

    cout<<"givenChar = "<<givenChar<<'\n';
    cout<<"address of givenChar = "<<(void*)&givenChar<<'\n';

    cout<<"givenString = "<<givenString<<'\n';
    cout<<"address of givenString = "<<&givenString<<'\n';

    return 0;
} 

Вывод:

givenInt = 32
address of givenInt = 0x7ffd62e17cd8
givenFloat = 64.212
address of givenFloat = 0x7ffd62e17cdc
givenChar = *
address of givenChar = 0x7ffd62e17cd7
givenString = 
address of givenString = 0x7ffd62e17ce0
givenDouble = 4.76545
address of givenDouble = 0x7ffd62e17ce8

Входная строка не появляется на выходе ..

Первая программа с cin.ignore () :

#include<iostream>
#include<string>

using namespace std;
int main()
{
    int givenInt;
    float givenFloat;
    double givenDouble ;
    std::string givenString;
    char givenChar;

    cin>>givenInt;
    cin>>givenFloat;
    cin>>givenDouble;
    cin.ignore();
    cin>>givenChar;
    cin.ignore();
    getline(cin,givenString);

    cout<<"givenInt = "<<givenInt<<'\n';
    cout<<"address of givenInt = "<<&givenInt<<'\n';

    cout<<"givenFloat = "<<givenFloat<<'\n';
    cout<<"address of givenFloat = "<<&givenFloat<<'\n';

    cout<<"givenDouble = "<<givenDouble<<'\n';
    cout<<"address of givenDouble = "<<&givenDouble<<'\n';

    cout<<"givenString = "<<givenString<<'\n';
    cout<<"address of givenString = "<<&givenString<<'\n';

    cout<<"givenChar = "<<givenChar<<'\n';
    cout<<"address of givenChar = "<<(void*)&givenChar<<'\n';

    return 0;
}

Выход:

givenInt = 32
address of givenInt = 0x7ffcf69bd9a8
givenFloat = 64.212
address of givenFloat = 0x7ffcf69bd9ac
givenChar = *
address of givenChar = 0x7ffcf69bd9a7
givenString = Hey look at me! I know pointers!
address of givenString = 0x7ffcf69bd9b0
givenDouble = 4.76545
address of givenDouble = 0x7ffcf69bd9b8

Входные строки появляются на выходе ..

Вторая программа с cin.ignore ():

#include<iostream>
#include<string>

using namespace std;
int main()
{
    int givenInt;
    float givenFloat;
    double givenDouble ;
    std::string givenString;
    char givenChar;

    cin>>givenInt;
    cin>>givenFloat;
    cin>>givenDouble;
    cin.ignore();
    getline(cin,givenString);
    cin.ignore();
    cin>>givenChar;
    cin.ignore();

    cout<<"givenInt = "<<givenInt<<'\n';
    cout<<"address of givenInt = "<<&givenInt<<'\n';

    cout<<"givenFloat = "<<givenFloat<<'\n';
    cout<<"address of givenFloat = "<<&givenFloat<<'\n';

    cout<<"givenDouble = "<<givenDouble<<'\n';
    cout<<"address of givenDouble = "<<&givenDouble<<'\n';

    cout<<"givenString = "<<givenString<<'\n';
    cout<<"address of givenString = "<<&givenString<<'\n';

    cout<<"givenChar = "<<givenChar<<'\n';
    cout<<"address of givenChar = "<<(void*)&givenChar<<'\n';

    return 0;
}

Выход

givenInt = 32
address of givenInt = 0x7ffe1ed66698
givenFloat = 64.212
address of givenFloat = 0x7ffe1ed6669c
givenChar = e
address of givenChar = 0x7ffe1ed66697
givenString = *
address of givenString = 0x7ffe1ed666a0
givenDouble = 4.76545
address of givenDouble = 0x7ffe1ed666a8 

Входной символ переходит в строковую переменную, а вторая буква строки печатается в символьной переменной ..

Я думал, что, поскольку double использует буфер для хранения символов (если я ошибаюсь, пожалуйста, исправьте меня), позвольте мне использовать его наконец, так как это не влияет входы, которые принимаются после double. Но я был неправ, и это дало мне такой же результат, как и в первой программе. И после тестирования обеих программ с использованием и без использования cin.ignore () я узнал, что нам нужно использовать cin.ignore() всякий раз, когда я беру ввод данных типа double и strings.

Мои вопросы:

1) Правильна ли моя концепция "использования cin.ignore () при вводе данных типа double и string datatpe")? Стоит ли вводить данные только в определенном порядке?

2) Почему (void*) используется вместе с &givenChar только для получения адреса символьного типа? &givenChar должен делать работу правильно?

1 Ответ

0 голосов
/ 29 марта 2020
  1. Когда вы используете cin >> ..., поток обрезает все пробелы в начале ввода и начинает анализировать остальные символы в объекте. Он останавливается, когда находит пробел или символ новой строки. Он не пропустит пробел в конце, а просто оставит его в потоке. getline делает то же самое, за исключением того, что не обрезает пробелы в начале. Он читает, пока не находит новую строку, сбрасывает эту новую строку и останавливается. Таким образом, если у вас есть getline() вызов после >>, вам нужно вручную удалить лишние пробелы в начале. Вот для чего ignore(). Он пропускает только один символ.

  2. &givenChar имеет тип char*. Тип std::cout, std::ostream имеет несколько перегрузок оператора <<. Один из них принимает тип char* и обрабатывает его как строку. Он пытается перебрать строку, пока не найдет нулевой терминатор. В этом случае &givenChar - это указатель на один символ, а не указатель на начало массива символов. Для выбора правильной перегрузки требуется приведение к (void*). Оператор << для void* отображает адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...