为啥下面两串代码中scanf和cin产生的效果不同?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥下面两串代码中scanf和cin产生的效果不同?相关的知识,希望对你有一定的参考价值。

输入a123。对于cin,程序挂起,无论怎么按enter都没有用;对于scanf,得到预期输出。请详细解释。

对于“异常”处理恐怕没有你想象那样有道道可讲,只能根据现象观测猜测
从现象看 cin保存了错误信息,第一次出错后,无论你后面怎样,出错信息不自动消除。而scanf_s没有保持错误信息,只要流合规了,就可以继续读入。这只是两个库具体实现结果,不是标准规定的。估计换个库现象可能还会变追问

如何有效的避免这种难以察觉的问题呢?

追答

首先你的逻辑是有问题的,遇到错误你没有正确的处理错误,而是直接去getchar了。如果你对错误关注并处理错误,肯定就没问题了。
其次:你的用例也是有问题的,cin/scanf读写不到数字你就不管了?你的逻辑不需要这个数?
所以这个题目关键是你用例本身不合理,且你完全没有处理异常导致的,不算“难以决擦”的问题

参考技术A 清理下流的状态。

在图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++可以运行。

用scanf同时输入不同类型的成员数据常常会出现意想不到的情况,这是为啥呢?

为啥不能用scanf读入一个含有空格的字符串

scanf和cin的差异

C++中cin,cout是否效率不如scanf,printf