为啥下面两串代码中scanf和cin产生的效果不同?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥下面两串代码中scanf和cin产生的效果不同?相关的知识,希望对你有一定的参考价值。
输入a123。对于cin,程序挂起,无论怎么按enter都没有用;对于scanf,得到预期输出。请详细解释。
对于“异常”处理恐怕没有你想象那样有道道可讲,只能根据现象观测猜测从现象看 cin保存了错误信息,第一次出错后,无论你后面怎样,出错信息不自动消除。而scanf_s没有保持错误信息,只要流合规了,就可以继续读入。这只是两个库具体实现结果,不是标准规定的。估计换个库现象可能还会变追问
如何有效的避免这种难以察觉的问题呢?
追答首先你的逻辑是有问题的,遇到错误你没有正确的处理错误,而是直接去getchar了。如果你对错误关注并处理错误,肯定就没问题了。
其次:你的用例也是有问题的,cin/scanf读写不到数字你就不管了?你的逻辑不需要这个数?
所以这个题目关键是你用例本身不合理,且你完全没有处理异常导致的,不算“难以决擦”的问题
在图1
a=getchar();
的上面加上
cin.clear();追问
我不是很懂这个“流”的知识,麻烦您详细解释一下,谢谢!
追答cin是输入流(就是一个类)的一个对象,每次操作都会将状态保存在cin对象中,如果发生了错误,就得清除错误状态才能继续下次操作。
本回答被提问者采纳确定两串乱序
【题目】
给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。
给定一个string stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。
【代码实现】
方法一:对字符排序比较
import java.util.*; public class Same { public boolean checkSam(String stringA, String stringB) { if(stringA == null || stringB == null || stringA.length() <= 0 || stringB.length() <= 0) return false; if (stringA.length() != stringB.length()){ return false; } char[] arrA = stringA.toCharArray(); char[] arrB = stringB.toCharArray(); //根据每个字符的ASCII码大小进行排序(空格也会被排序) Arrays.sort(arrA); Arrays.sort(arrB); return Arrays.equals(arrA, arrB); } }
方法二:使用HashMap:
链接:https://www.nowcoder.com/questionTerminal/164929d4acd04de5b0ee2d93047b3b20?toCommentId=535049 来源:牛客网 import java.util.*; public class Same { public boolean checkSam(String stringA, String stringB) { if(stringA == null || stringB == null || stringA.length() <= 0 || stringB.length() <= 0) return false; if(stringA.length() != stringB.length()) return false; Map<Character, Integer> map = new HashMap<>(); for(int i = 0; i < stringA.length(); i++){ if(map.containsKey(stringA.charAt(i))){ map.put(stringA.charAt(i), map.get(stringA.charAt(i)) + 1); }else{ map.put(stringA.charAt(i), 1); } } for(int i = 0; i < stringB.length(); i++){ if(map.containsKey(stringB.charAt(i))){ map.remove(stringB.charAt(i)); } } if(!map.isEmpty()){ return false; } return true; } }
以上是关于为啥下面两串代码中scanf和cin产生的效果不同?的主要内容,如果未能解决你的问题,请参考以下文章
scanf()和cin的区别,用scanf,则没有输出数据,为啥?
为啥scanf不能接收键盘输入,被跳过???改成C++的cin>>后便可以接收并继续下去。全部换成C++可以运行。