前言:
因为 C++ 兼容 C 的头文件,而两者又各自有着自己关于标准输入的内容,并且这些用法都比较常用,大家也都是根据自己的习惯自己选择。这些函数本身就容易混淆,还不能置之不理,所以总结几个常用的。
-
scanf() 和 cin >>:
首先这应该是 C 和 C++ 最常用的标准读入写法。其实本身大家都能区分的开,但是有一、两点大家平时可能不太注意。
首先要知道 cin >> 的用法,其实cin >> 是根据流中的类型自动匹配,而 scanf() 是我们人为的指定类型。显而易见,scanf()的写法从读入的时间上来说是要快一点儿的(毕竟省去了判断类型的过程)。
其次,cin >> 由于不用提前规定读入类型,那么也就意味着读入任何数据其函数内部处理的内容是一致的。那么重点是这会导致什么呢?我们知道通常读入整数之类的类型时是会自动忽略空白符的,所以说如果想通过cin >> 读入一个字符时也会如此。而 scanf("%c",&c)时会读入空格。这一点平时容易忽略。
-
getchar() 和 gets():
二者都是在 <stdio.h> 下的函数,前者是读入单个字符,后者是读入字符串。写法分别为 getchar() 和 gets(char *cs)。需要注意的是 getchar() 返回的结果不是字符,而是其对应的 ASCII 码 即 int getchar()。而 gets() 则不可以读入 string 类型,道理也很简单,就是 string 是 C++ 标准库中的东西,有 gets() 时还没有 string ,并且之后 C++ 标准库的目的也是定义一个新的标准,所以一般也没必要返回头来修改 C 头文件的东西来适应 C++。
-
getline() 和 cin.getline():
这两个函数因为名字一样但是很容易混淆,但二者却不是非常相似。前者是定义在 <string> 标准库中,而后者是定义在 <iostream> 中的,这是一点不同。再有从这个小标题就可以看出,前者是 <string> 独立的一个函数,而后者则是输入流的成员函数,这是另一点。
那么二者用法上有什么区别呢?首先功能上二者都是读取一行数据(因为默认的终止符是’\n’),但是用于接收的变量不一样。前者的常用写法是 getline(输入流对象[例如标准输入流 cin],string 对象),也就是用 string 类型的对象来接收数据;而后者的写法则是cin.getline(char *cs,int 读入的最长个数,终止符 = ‘\n’ ),也就是说后者只能用 char 型数组等来接收。
总结:
- 上述函数的终止符都有 ‘\n’、EOF。
- cin >> 和 getline() 可以读入 string 类型,其余不可以。
- cin >> 何时都忽略空白符,而 scanf()等函数则在读入的是非 char 的类型是忽略空白符。