首页 > 解决方案 > 在这个程序中应该如何输入字符串和双精度数据类型?

问题描述

我正在学习指针的概念,就像我以为我明白了我的概念一样,这个程序让我很难理解不同数据类型的输入是如何存储在程序中的。

然后我了解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应该做正确的工作吗?

标签: c++pointers

解决方案


  1. 当您使用cin >> ...流时,会从输入的开头修剪所有空格,并开始将其余字符解析到对象中。它在找到空格或换行符时停止。它不会在最后跳过空格,而是将其留在流中。getline稍有相同,只是它在开始时修剪空白。它读取直到找到换行符,丢弃该换行符,然后停止。因此,如果您在 agetline()之后有电话>>,那么您需要在开头手动删除多余的空格。这ignore()就是为了。它只是跳过一个字符。

  2. &givenChar有类型char*std::cout, ,的类型std::ostream有几个<<运算符的重载。其中一个接受类型char*并将其视为字符串。它尝试遍历字符串,直到找到一个空终止符。在这种情况下&givenChar,是指向单个字符的指针,而不是指向字符数组开头的指针。为了选择正确的重载,(void*)需要强制转换。<<用于void*显示地址的运算符。


推荐阅读