scanf、gets、getchar、cin、cin.get、cin.getline、getline总结

一、scanf
scanf一般可用于读取数字、字符、字符串;
结论:
(1)当 scanf 从缓冲区中读取单个字符(%c)时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,scanf 不会将其忽略,会读取并清除。
(2)当 scanf 从缓冲区中读取数字或字符串(非单个字符)时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,scanf 会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,scanf 不做处理。
(3)scanf 读取字符串时,当遇到空格、回车和Tab键都会认为输入结束。当遇到回车,空格和tab键会自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中。(所以它不能接收包含空格、回车或Tab等的字符串)
(4)scanf() 读取字符串时,
语法:scanf(“格式控制字符串”,变量地址列表);
接受字符串时:scanf(“%s”,字符数组名或指针);

二、gets
gets 一般只用于读取字符串;
结论:
(1)gets可以接收空格,遇到回车认为输入结束;
(2)gets 可接受回车键之前输入的所有字符,并用’\n’替代 ‘\0’。回车键不会留在输入缓冲区中。
(3)gets() 读取字符串时,
语法:gets(字符数组名或指针);
(4)gets(s) 函数中的变量s为一字符串指针。如果为单个字符指针,编译连接不会有错误,但运行后内存溢出错误。
(5)gets函数可以无限读取,不会判断上限,以回车结束读取,所以应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。

三、getchar
getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab);注意,getchar函数只能接受单个字符,输入数字也按字符处理,输入多于一个字符时,只接收第一个字符。
结论:
(1)getchar 由宏实现:#define getchar() getc(stdin)。getchar有一个int型的返回值。当程序调用getchar时,程序就等着用户按键,用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止,此时进入到输入缓冲区中(回车字符也放在缓冲区中)。
(2)当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符。getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕。
(3)如果用户在按回车之前输入了不止一个字符,其他字符会保留在输入缓冲区中,等待后续getchar调用读取。即后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。
(4)getchar函数获取从键盘上输入的一个字符的形式如下:

// 其一般形式为:getchar(); 通常把输入的字符赋予一个字符变量,构成赋值语句,如:
char c;
c = getchar();
  • 1
  • 2
  • 3

(5)使用getchar的场景:
场景一:
例如,前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’,所以此时使用getchar()可以把这个回车符取走,从而保证读取正确。(从缓冲区读走一个字符,相当于清除缓冲区)

场景二:

while(getchar() != '\n');
  • 1

键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到’\n’。如果需要消除 ‘\n’ 的影响,可以用getchar();来清除,这里getchar();只是取得了’\n’但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符。
<6> 可以用getche()或getch()代替getchar(),其作用是从键盘读入一个字符(不用按回车),注意要包含头文件<conio.h>

四、cin
该操作符是根据后面变量的类型读取数据。
输入结束条件 :遇到Enter、Space、Tab键。
对结束符的处理 :丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)
结论:
(1)当cin>>从缓冲区中读取数据(不论是字符、数字或字符串)时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。

五、cin.get( )
该函数有三种常用格式:无参,一参数,二参数
即cin.get(), cin.get(char ch), cin.get(array_name, Arsize)
对应的函数原型如下:
int cin.get();
istream& cin.get(char& var);
istream& get ( char* s, streamsize n ); // 读取字符串时,默认以换行符结束。
istream& get ( char* s, streamsize n, char delim ); // 读取字符串时,第三个参数可指定结束符。

结论:
(1)读取字符的情况:
输入结束条件:Enter键
对结束符处理:不丢弃缓冲区中的Enter
cin.get() 与 cin.get(char ch)用于读取字符,他们的使用是相似的,
即:ch=cin.get() 与 cin.get(ch)是等价的。
注意:
<1> cin.get()从输入缓冲区读取单个字符不忽略分隔符,直接将其读取。
<2> ch = cin.get()的返回值是int类型,读取成功时,返回读取字符的ASCII码值;遇到文件结束符时,返回EOF,即-1。
<3> cin.get(ch)如果读取成功,返回的是cin对象,因此可以支持链式操作,如cin.get(b).get(c)。

(2)读取字符串的情况:
<1> cin.get(array_name, Arsize)是用来读取字符串的,可以接受空格字符,遇到Enter结束输入,按照长度(Arsize)读取字符。
<2> 输入超长,则按需要的长度取数据。
char ch, a[20];
cin.get(a, 5);
输入:
12345[Enter]
输出:
1234
分析:输入超长,字符串按长度取了”1234”,而’5’仍残留在缓冲区中;注意:每个字符串的尾部都有一个空字符‘\0’,要考虑到长度内。
<3> cin.get(array,20);读取一行时,遇到换行符时结束读取,但是不对换行符进行处理,换行符仍然残留在输入缓冲区。可以用cin.get()将换行符读入变量b来打印验证,发现打印结果为10,即换行符的ASCII码值。这也是cin.get()读取一行与使用getline读取一行的区别所在。getline读取一行字符时,默认遇到’\n’时终止,并且将’\n’直接从输入缓冲区中删除掉,不会影响下面的输入处理。
<4> cin.get(str,size);读取一行时,只能将字符串读入C风格的字符串中,即char*;但是C++的getline函数可以将字符串读入C++风格的字符串中,即string类型。鉴于getline较cin.get()的这两种优点,建议使用getline进行行的读取。关于getline的用法,下文将进行详述。

六、cin.getline( )
函数作用:从标准输入设备键盘读取一串字符串,并以指定的结束符结束。
函数原型有两个:
istream& getline(char* s, streamsize count); // 默认以换行符结束
istream& getline(char* s, streamsize count, char delim);
结论:
(1)cin.getline() 与 cin.get(array_name, Arsize)的读取方式差不多,以Enter结束,可以接受空格字符,按照长度(Arsize)读取字符。
(2)cin.getline与cin.get的区别
<1> cin.getline不会将结束符或者换行符残留在输入缓冲区中。
<2> cin.get(array_name, Arsize)当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。

七、getline( )
C++中定义了一个在std名字空间的全局函数getline,因为这个getline函数的参数使用了string字符串,所以声明在了< string>头文件中了。
getline利用cin可以从标准输入设备键盘读取一行,当遇到如下三种情况会结束读操作:1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。
函数原型有两个重载形式:
istream& getline ( istream& is, string& str); / /默认以换行符结束
istream& getline ( istream& is, string& str, char delim);
使用示例:

#include <string> 
#include <iostream>
using namespace std;

int main()
{
    string str;
    getline(cin,str);
    cout<<str<<endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

结论:
(1)注意,getline遇到结束符时,会将结束符一并读入指定的string中,再将结束符替换为空字符(’\0’)。因此,进行从键盘读取一行字符时,建议使用getline,较为安全。
(2)和 cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数。

好的文章让我有转载的冲动。文章来源:https://blog.csdn.net/cyuyanenen/article/details/51602922


猜你喜欢

转载自blog.csdn.net/pleasantly1/article/details/81035576
今日推荐