指向int的指针,输入非数字程序崩溃

指向int的指针,输入非数字程序崩溃,第1张

在cin>><int/float>时 如果我们输入一个字符,就会导致刷屏的结果,这是因为非数字字符无法被cin接收而一直停留在缓冲区,导纯慎致下一次cin时直接从缓存读数,但字符无法读取结果导致无限循环,这被很多人认为成库的bug。

还有当您cin一个整数时,不小心输入了小数,也会造成无限循环的问题,这个问题又如何解释呢?

解决方法:

1>在cin>><int/float>后加cin.ignore()cin.clear()

cin.ignore()方法cin.ignore( 5, 'c' ) 的是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到5或者被抛弃的字符是'c',则cin.ignore() 函数执行终止;否则,它继续等待。 它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:cin.ignore( 1024, '\n' ),通州祥常把第一个参数设置得足够大,这样实际上总是只有第二个参数 '\n' 起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。

cin.clear用法如果输入发生错误发生,那么流状态既被标记为错误,你必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用册裤搏clear()函数。此函数带一个参数,它是你将要设为当前状态的标志值。,只要将ios::goodbit作为实参。

2>在cin>><int/float>后加fflush(stdin)(需要stdio.h)

注: fflush(stdin)刷新标准输入缓冲区,需要stdio.h

我抽象了一个小模型,代码如下

#include"iostream"

using namespace std

int main()

{

int n

cout<<"input:"

cin>>n

while (n<=0)

{

cout<<"error,input agian!"<<endl

cin>>n

}

return 0

}

看似毫无问题

调试时也往往被忽略

如输入一个正整数没问题

若输入非正整数也没问题

可当输入一个字母或其它时,将出现死循环

解决方法如下

#include"iostream"

using namespace std

int main()

{

int n

cout<<"input:"

cin>>n

while (n<=0)

{

cin.clear()///

cin.ignore()///

cout<<"error,input agian!"<<endl

cin>>n

}

return 0

}

cin.clear()前面状态为假了,再输入就不被执行了,清空缓冲区,并将错误的cin流标识,通过这个可以把假状态清除掉,加上cin.ignore()就可解决编译器编译while循环时因在缓冲区找不到合乎条件的数据而出现死循环的情况了。

Python 3 的 input() 函数相当于 Python 2 的 raw_input() 函数。

1

2

3

4

5

6

7

8

9

10

11

# 输入数字

# Python 3 通过 input() 获取的任何内容都是 str(字符串)类型。

str1 = input('铅蔽请输入第一厅雹个数:')

str2 = input('请输入第二个数:')

# 用 int() 函数强制将 str 转换扮激帆成 int

num1 = int(str1)

num2 = int(str2)

# 加法运算并打印

print('{0} + {1} = {2}'.format(num1, num2, num1 + num2))

while (true)

{

Console.WriteLine("请输入年龄:")

string strAge = Console.ReadLine()

int age = 0

try

{

age = Convert.ToInt32(strAge)

}

catch (Exception)

{

Console.WriteLine("输入的不是数字!")

continue

}

if (age >18)

{

Console.WriteLine("可以查看")

}

else if (age <0)

{

Console.WriteLine("非法错误!")

}

else if (age <10)

{

Console.WriteLine("不允许查看")

}

else

{

Console.WriteLine("你是否继续查看(yes、no)?")

String isContinue = Console.ReadLine()

if (isContinue == "yes")

{

Console.WriteLine("也没什么好看明旅的"激纯凳)

}

else if (isContinue == "裤纤no")

{

Console.WriteLine("爱看不看。")

}

else

{

Console.WriteLine("非法错误!")

}

}

Console.ReadKey()

break

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12341160.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存