为什么这段代码循环输出的数组少了第一个元素且多出了一个随机数?

输入一些非负实数 用数组输出这些数 求平均数并输出(输入负数时报错并退出重新输入,输入回车时执行下一步操作)

#include
using namespace std;
int main()
{
int i,j,k;
double a[100],sum=0,avr;
part1:
cout<<"输入数字"< j=0,k=0;
for (i=0;getchar()!='\n';i++)
{
cin>>a[i];
if (a[i]< 0)
{
j=1;
}
k++;
}
if(j==1)
{
cout<<"您在数据中输入了一个负数"<<endl;
goto part1;
}
cout<<"输入的数据为:"<<endl;
for(i=0;i<=k;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
for(i = 0;i<=k;i++)
{
sum=sum+a[i];
}
avr=sum/(k+1);
cout<<avr;
return 0;
}

.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符..如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.

第一个字符被getchar()用掉了。

    for (i=0;getchar()!='\n';i++)
    {
        cin>>a[i];
        if (a[i]< 0)
        {
            j=1;
        }
        k++;
    } 

后面的循环应该是i<k,多了一次,输出了一个随机数

    for(i=0;i<=k;i++)
    {
        cout<<a[i]<<" ";
    }

代码粘贴有错误,重粘一遍

 cout<<"输入数字"< j=0,k=0; 

应该是你的代码有问题,少用goto多用循环

输入一行数字,当按下回车后,getchar()读取第一个字符,将其余的放入缓冲区,包括回车。
所以你的程序可以这样改,把第一个字符退回输入流。

    for (i=0;(ch=getchar())!='\n';i++)
    {
        ungetc(ch,stdin);//退回第一个字符
        cin>>a[i];
        if (a[i]< 0)
        {
            j=1;
        }
        k++;
    }

    char ch;
    for (i=0;(ch=getchar())!='\n';i++)
    {
        ungetc(ch,stdin);//退回第一个字符
        cin>>a[i];
        if (a[i]< 0)
        {
            j=1;
        }
        k++;
    }