标题:这个问题如何解决?
只看楼主
hffjhhh
Rank: 1
等 级:新手上路
帖 子:127
专家分:7
注 册:2019-4-10
结帖率:90.38%
已结贴  问题点数:10 回复次数:4 
这个问题如何解决?
这段代码在编译器中输入:
3.4 5.6 p
编译器输出结果为:
fil_array:2
show_array:44 2 5 67
show_array1:4.9007e-317 4.88941e-317

为什么程序跳过了show_array1()函数中的输入环节?在
cout<<p[j]<<' ';

这行就输出了4.9007e-317 4.88941e-317这两个奇怪的数字?
如何修改?代码如下:
程序代码:
#include<iostream>
using namespace std;
int fill_array(double ar[],int size){
    int i,count;
    count=0;
    i=0;
    while(cin>>ar[i]&&i<size){
        count++;
        i++;
    }
    return count;
}
void show_array(double ar[],int size){
    cout<<"show_array:";
    for(int i=0;i<4;i++)
        cout<<ar[i]<<' ';
}
double *show_array1(){
    double *b=new double[5];
    for(int i=0;i<5;i++){
        if(!(cin>>b[i]))
            break;
    }
    return b;
}
int main(void){
    double b[8];
    int a=fill_array(b,8);
    cout<<"fil_array:"<<a<<endl;
    
    double c[4]={44,2,5,67};
    show_array(c,4);
    cout<<endl;
    
    double *p=show_array1();
    cout<<"show_array1:";
    for(int j=0;j<=sizeof(p)/sizeof(*p);j++)
        cout<<p[j]<<' ';
    delete [] p;
        
    return 0;
}


[此贴子已经被作者于2020-11-30 22:50编辑过]

搜索更多相关主题的帖子: int double cout count return 
2020-11-30 22:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
当 cin>>ar[i] 失败后,cin的状态设为错误,且"p"依然留在输入缓冲区中。

另外,sizeof(p)/sizeof(*p) 是错误的,它等同于 sizeof(double*)/sizeof(double),而非你以为的5
2020-11-30 23:33
hffjhhh
Rank: 1
等 级:新手上路
帖 子:127
专家分:7
注 册:2019-4-10
得分:0 
以下是引用rjsp在2020-11-30 23:33:40的发言:

当 cin>>ar 失败后,cin的状态设为错误,且"p"依然留在输入缓冲区中。

那应该如何读取依然留在输入缓冲区中的'p'呢?我尝试添加以下语句,但也无法读取:
char ch;
while(cin<<ch)
    continue;
2020-12-01 14:26
hffjhhh
Rank: 1
等 级:新手上路
帖 子:127
专家分:7
注 册:2019-4-10
得分:0 
以下是引用rjsp在2020-11-30 23:33:40的发言:
另外,sizeof(p)/sizeof(*p) 是错误的,它等同于 sizeof(double*)/sizeof(double),而非你以为的5

sizeof(double*)是不是获取p指向的内存空间大小?也就是4*5=20?
sizeof(double)是不是获取p指向变量的类型大小?也就是4?
为什么不是5?

[此贴子已经被作者于2020-12-1 20:01编辑过]

2020-12-01 14:33
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
sizeof(double*)是不是获取p指向的内存空间大小?
你想想呗,编译器在编译时看到 sizeof(double*) 中的 double* 这个类型时就知道你定义了一个 double* 变量?就知道这个变量指向的空间大小?就知道你想要的就是这个double*变量而非另一个double*变量?除非是神仙。

程序代码:
#include <iostream>
#include <span>
#include <vector>
#include <limits>
using namespace std;

size_t fill_array_via_cin( std::span<double> ar )
{
    size_t count;
    for( count=0; count!=size(ar) && cin>>ar[count]; ++count );
    return count;
}

std::ostream& show_array_via_cout( const std::span<double> ar )
{
    cout << '{';
    for( const auto& v : ar )
        cout << ' ' << v;
    cout << " }";
    return cout;
}

std::vector<double> get_array_via_cin( size_t maxcount )
{
    vector<double> ret( maxcount );
    size_t n = fill_array_via_cin( ret );
    ret.resize( n );
    return ret;
}

int main( void )
{
    double a[8];
    size_t n = fill_array_via_cin( a );
    cout << "fill_array_via_cin return " << n << '\n';
    show_array_via_cout( span(a,n) ) << endl;

    // 清除 cin 的错误状态,以及清除一行输入缓冲
    if( cin.fail() )
    {
        cin.clear();
        cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    }

    double b[] = { 44, 2, 5, 67 };
    show_array_via_cout( b ) << endl;

    std::vector<double> c = get_array_via_cin( 5 );
    show_array_via_cout( c ) << endl;
}


输入:
3.4 5.6 p 9 9 9
0 1 2 3 4


输出:
fill_array_via_cin return 2
{ 3.4 5.6 }
{ 44 2 5 67 }
{ 0 1 2 3 4 }
2020-12-01 20:07



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-504080-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.333273 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved