Я изучал понятия указателей, и, как только я подумал, что получил свои понятия, эта программа доставила мне затруднения с пониманием того, как входы различных типов данных хранятся в программе.
А потом я узнал о 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
должен делать работу правильно?