gpt4 book ai didi

c++ - 为什么 scanf 似乎跳过了输入?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:33 25 4
gpt4 key购买 nike

我对以下程序中 scanf 的行为感到困惑。 scanf 似乎输入了一次,然后不再输入,直到打印出字符流。

下面是一个C程序

#include<stdio.h>
int main()
{
int i, j=0;

do
{
++j;
scanf("%d", &i);
printf("\n\n%d %d\n\n", i, j);
}
while((i!=8) && (j<10));

printf("\nJ = %d\n", j);
return 0;
}

在这里,Till i am inputing any integer program works perfectly fine,但是当输入一个字符时,它会继续打印 i 的最后输入值并且永远不会停止(直到循环退出时 j 为 10)以便 scanf 接受下一个输入.

output::  
1 <-----1st input
1 1
2 <---- 2nd input
2 2
a <---- character input
2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 10

J = 10

同样的事情也在 C++ 中发生。

#include<iostream>
using namespace std;
int main()
{
int i, j=0;

do
{
++j;
cin>>i;
cout<<i<<" "<<j<<"\n";
}
while((i!=8) && (j<10));

cout<<"\nj = "<<j<<"\n";
}


output of c++ program ::
1 <-----1st input
1 1
2 <-----2nd input
2 2
a <------ character input
0 3
0 4
0 5
0 6
0 7
0 8
0 9
0 10

j = 10

C++ 中唯一的变化是打印 0 而不是最后一个值。

我知道这里程序需要整数值,但我想知道当输入字符代替整数时会发生什么?上面发生的一切的原因是什么?

最佳答案

当你输入a时,cin >> i无法读取它,因为i的类型是int 无法读取其中的字符。这意味着,a 永远保留在流中。

现在为什么 i 打印 0 是另一回事了。实际上它可以打印任何东西。一旦尝试读取失败,i 的内容将不会被定义。 scanf 也会发生类似的事情。

正确的写法是:

do
{
++j;
if (!(cin>>i))
{
//handle error, maybe you want to break the loop here?
}
cout<<i<<" "<<j<<"\n";
}
while((i!=8) && (j<10));

或者只是这样(如果你想在发生错误时退出循环):

int i = 0, j = 0;
while((i!=8) && (j<10) && ( cin >> i) )
{
++j;
cout<<i<<" "<<j<<"\n";
}

关于c++ - 为什么 scanf 似乎跳过了输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10935558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com