c++ - 在这个程序中应该如何输入字符串和双精度数据类型?
问题描述
我正在学习指针的概念,就像我以为我明白了我的概念一样,这个程序让我很难理解不同数据类型的输入是如何存储在程序中的。
然后我了解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()
每当我输入双精度和字符串数据类型时,我们都需要使用。
我的问题是,
1) 我的“在输入双精度和字符串数据类型时使用 cin.ignore()”的概念是否正确?我应该只按特定顺序输入吗?
2)为什么只(void*)
使用with&givenChar
来获取字符类型的地址?&givenChar
应该做正确的工作吗?
解决方案
当您使用
cin >> ...
流时,会从输入的开头修剪所有空格,并开始将其余字符解析到对象中。它在找到空格或换行符时停止。它不会在最后跳过空格,而是将其留在流中。getline
稍有相同,只是它在开始时不修剪空白。它读取直到找到换行符,丢弃该换行符,然后停止。因此,如果您在 agetline()
之后有电话>>
,那么您需要在开头手动删除多余的空格。这ignore()
就是为了。它只是跳过一个字符。&givenChar
有类型char*
。std::cout
, ,的类型std::ostream
有几个<<
运算符的重载。其中一个接受类型char*
并将其视为字符串。它尝试遍历字符串,直到找到一个空终止符。在这种情况下&givenChar
,是指向单个字符的指针,而不是指向字符数组开头的指针。为了选择正确的重载,(void*)
需要强制转换。<<
用于void*
显示地址的运算符。
推荐阅读
- azure-blob-storage - Azure 数据工厂缺少 Blob 触发器
- java - 有没有办法使用 Java Hibernate 锁定 MySQL 数据库中的行
- google-chrome-devtools - 查找表单的 REST 请求
- sql - SQL - 按范围分组值
- postgresql - Postgres 选择了错误的执行计划。真空分析似乎没有改变主意
- c# - 如何保存/加载游戏时间?(统一引擎)
- awk - 如何将重复的行合并到具有主键和多于一列信息的同一行中
- android - Flutter:使用 AppBar 导航时留在包装器内
- javascript - 使用 Vue.js 或 Nuxt.js 混合 SSR 和静态
- linux - 如何让我的应用在 Ubuntu 后台运行