当前位置: 首页 > 编程笔记 >

c++中cin/cout与scanf/printf的区别比较

百里星纬
2023-03-14
本文向大家介绍c++中cin/cout与scanf/printf的区别比较,包括了c++中cin/cout与scanf/printf的区别比较的使用技巧和注意事项,需要的朋友参考一下

cin 、cout   

基本说明:

  cin代表标准输入设备,使用提取运算符 ">>" 从设备键盘取得数据,送到输入流对象cin中,然后送到内存

  cin是输入流,cout是输出流,重载了">>"、"<<"运算符,包含在头文件<iostream>中。

  先把要输出的东西存入缓冲区,再输出,导致效率降低,cin是自动判断你的变量类型,比如一个char数据只能用默认的char方法取数据。

scanf 、printf

基本说明:

  scanf是格式化输入,printf是格式化输出,包含在头文件<stdio.h>中。

  因为scanf是用指针操作的,没有类型安全机制,比如一个char类型数据你就可以用%f获得输入,而不会报错,但在运行时会出现异常。

  scanf()函数取数据是遇到回车、空格、TAB就会停止,如例1,第一个scanf()会取出"Hello",而"world!"还在缓冲区中,这样第二个scanf会直接取出这些数据,而不会等待从终端输入。

例1:

 #include <stdio.h>
 int main()
 {
  char str1[20], str2[20];
  scanf("%s",str1); 
  printf("%s\n",str1);  
  scanf("%s",str2); 
  printf("%s\n",str2); 
  return 0;
 }

测试一输入:
Hello world!
输出:
Hello
world!

第一个scanf()会取出"Hello",而"world!"还在缓冲区中,这样第二个scanf会直接取出这些数据,而不会等待从终端输入。

为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
这个函数是fflush(stdin)。
方法2:自己取出缓冲区里的残留数据。
(说实话这个语句我也没看懂,呵呵!为什么格式控制是这样的!希望高手指点一下!)
scanf("%[^\n]",string);

gets()

基本说明:

  gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'\0'字符。包含在头文件<stdio.h>中。

  gets(s)函数与 scanf("%s",&s) 相似,但不完全相同,使用scanf("%s",&s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。

原型:

  char*gets(char*buffer);

例2:

#include <stdio.h>
int main()
{
  char str1[20], str2[20];
  gets(str1); 
  printf("%s\n",str1);  
  gets(str2); 
  printf("%s\n",str2); 
  return 0;
}

测试:
Hello world! [输入]
Hello world! [输出]
12345 [输入]
12345 [输出]

为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
这个函数是fflush(stdin)。
方法2:自己取出缓冲区里的残留数据。
(说实话这个语句我也没看懂,呵呵!为什么格式控制是这样的!希望高手指点一下!)
scanf("%[^\n]",string);

输入操作的原理

与前一节中提到的scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因!

cin的一些输入函数和操作符

cin is a extern istream object。提供了很多可用的成员函数和重载的操作符,如:cin<<, cin.get(),   cin.getline()等。下面我们来了解一下这几个函数:

一. cin<<

该操作符是根据后面变量的类型读取数据。
输入结束条件   :遇到Enter、Space、Tab键。
对结束符的处理 :丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)

二.cin.get()

该函数有三种格式:无参,一参数,二参数

即cin.get(), cin.get(char ch), cin.get(array_name,   Arsize)

读取字符的情况:

输入结束条件:Enter键
对结束符处理:不丢弃缓冲区中的Enter

cin.get() 与 cin.get(char ch)用于读取字符,他们的使用是相似的,
即:ch=cin.get() 与 cin.get(ch)是等价的。

 

读取字符串的情况:

cin.get(array_name, Arsize)是用来读取字符串的,可以接受空格字符,遇到Enter结束输入,按照长度(Arsize)读取字符, 会丢弃最后的Enter字符。

程序6:

#include <iostream>
using namespace std;
int main ()
{
char a[20];
cin.get(a, 10);
cout<<a<<endl;
return 0;
}

测试一输入:

abc def[Enter]

输出:

abc def

【分析】说明该函数输入字符串时可以接受空格。

测试二输入:

1234567890[Enter]

输出:

123456789

【分析】输入超长,则按需要的长度取数据。

程序7:

#include <iostream>
using namespace std;
int main ()
{
char ch, a[20];
cin.get(a, 5);
cin>>ch;
cout<<a<<endl;
cout<<(int)ch<<endl;
return 0;
}

测试一输入:

12345[Enter]

输出:

1234

53

【分析】第一次输入超长,字符串按长度取了"1234",而'5'仍残留在缓冲区中,所以第二次输入字符没有从键盘读入,而是直接取了'5',所以打印的ASCII值是53('5'的ASCII值)。

测试二输入:

1234[Enter]

a[Enter]

输出:

1234

97

【分析】第二次输入有效,说明该函数把第一次输入后的Enter丢弃了!

三.cin.getline()

cin.getline() 与 cin.get(array_name, Arsize)的读取方式差不多,以Enter结束,可以接受空格字符。按照长度(Arsize)读取字符, 会丢弃最后的Enter字符。

但是这两个函数是有区别的:

cin.get(array_name,   Arsize)当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。(具体原因将在下一部分"cin的错误处理"中详细介绍)

程序8:

#include <iostream>
using namespace std;
int main ()
{
char ch, a[20];
cin.getline(a, 5);
cin>>ch;
cout<<a<<endl;
cout<<(int)ch<<endl;
return 0;
}

测试输入:

12345[Enter]

输出:

1234

-52

【分析】与cin.get(array_name, Arsize)的例程比较会发现,这里的ch并没有读取缓冲区中的5,而是返回了-52,这里其实cin>>ch语句没有执行,是因为cin出错了!

 类似资料:
  • cin和cout为什么比printf以及scanf慢? 我曾经搜索过,但是没有任何满意的答案 希望有大佬解答

  • 在C语言中,我们通常会使用 scanf 和 printf 来对数据进行输入输出操作。在 C++语言中,C语言的这一套输入输出库我们仍然能使用,但是 C++ 又增加了一套新的、更容易使用的输入输出库。 【例1】简单的输入输出代码示例: 运行结果如下(↙表示按下回车键): Please input an int number: 8↙ The int number is x= 8 Please inpu

  • 本文向大家介绍C语言中scanf()和gets()之间的区别,包括了C语言中scanf()和gets()之间的区别的使用技巧和注意事项,需要的朋友参考一下 在C语言中,都定义了和函数,以从外部源获取输入并将其作为输入传递给系统。现在,两个功能之间存在一些特性差异。 以下是和之间的重要区别- 序号 键 scanf()函数 gets()函数 1 定义 该方法可以从键盘读取输入,并根据给定的格式说明符将

  • 本文向大家介绍C#中equal与==的区别相关面试题,主要包含被问及C#中equal与==的区别时的应答技巧和注意事项,需要的朋友参考一下 答: C#中,判断相等有两种方式,一种是传统的==操作,一种是object提供的Equals方法。 二者的区别在于: 一、==操作符判断的是堆栈中的值,Equlas判断的是堆中的值 C#提供值类型和引用类型,值类型存储在栈上,故用==判断是直接判断其值是否相等

  • 我试图理解scanf和输入缓冲区之间的关系。我将scanf与以下格式字符串一起使用: 并尝试理解为什么我可以输入尽可能多的空白(输入,空白,选项卡)后,我输入一个数字,如54,并按回车键。 据我所知,我按下的每一个键都会被放入输入缓冲区,直到我按下回车键。 因此,如果我输入54并按Enter键,输入缓冲区包含3个元素,两个数字和换行符。所以我的缓冲区看起来像[5][4][\n] 现在从左到右计算s

  • 只是想知道是否有人能向我解释这种行为?是意料之中的吗?我需要使用std::fixed来强制打印双打吗?