关于c++和C的getXXX系列函数

来源:互联网 发布:天谕男玉虚捏脸数据图 编辑:程序博客网 时间:2024/06/07 01:21

1,C
scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别。
scanf :遇到回车,空格和tab键会都会认为输入结束并自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中。scanf()可以读取所有类型的变量
gets:可接受回车键之前输入的所有字符,并用’\0’替代 ‘\n’.回车键不会留在输入缓冲区中,gets()用到读取字符串,用回车结束输入

char str[30];
gets(string); /遇到回车认为输入结束/
scanf(“%s”,str); /遇到空格,回车,TAB 认为输入结束/
1.不同点
scanf()
所在头文件:stdio.h
调用形式:scanf(“格式控制字符串”,变量地址列表);
接受字符串时:scanf(“%s”,字符数组名或指针);

gets()
所在头文件:stdio.h
语法:gets(字符数组名或指针);
两者在接受字符串时:
scanf不能接受空格、制表符Tab、回车等;
而gets能够接受空格、制表符Tab和回车等;

2.相同点:
字符串接受结束后自动加’\0’。

#include<stdio.h>#include<stdlib.h>int main(){    int m;    char a[5];    scanf("%d",&m);    //char c=getchar();    //gets(a);    gets(a);    printf("%s",a);    return 0;}

意外运行结果:
这里写图片描述

在上边代码中,还没有来得及输入字符串a,程序就结束了,问题在于,使用scanf读取C分格字符串时或其他用户变量时,用户敲击键盘的换行符留在了输入队列,导致后边的gets()或者getline()函数会看到换行符,认为到达行尾,所以没有读到内容,解决办法是在scanf的语句后加上char c=getchar()或者gets(a);,把留在缓冲中的回车符消除掉,下一次即可正确输入
这里写图片描述

2 C++
C++中字符串可以作为一个整体来输出

#include <iostream>using namespace std;int main(int argc, char *argv[]){   char str[]="Welcome to the c++ world!";//创建字符数组,用C风格字符串为其初始化    cout<<str<<endl;//输出C风格字符串为其初始化    cout<<"请重新输入一个字符串"<<endl;    cin>>str;//字符数组的整体输入长度不超过长度-2,留出一个字节'\0'    //用cin>>进行输入,跳过前导空白,从第一个有效字符算起,直到遇到第一个空白符,所以hello world后边的world忽略了,如果字符串最后不预留好'\0',在输出的时候会输出错误的信息    cout<<str<<endl;    return 0;}

这里写图片描述
get()函数和getline()函数
这里就要用到iostream类的getline和get()函数,两个函数都用于读取一行输入,直到遇到换行符,但是getline()函数丢弃了换行符,而get()函数也将换行符存入了C风格字符串,

#include <iostream>using namespace std;int main(int argc, char *argv[]){    char name[16];//创建一个字符数组,表示姓名    char school[50];    cout<<"请输入你的姓名:"<<endl;    cin.get(name,16);//使用cin提供的get函数读取一串祖父    cin.get();//从输入流中读出换行符中,否则下边的getline()函数会接受get函数遗留在回车队列里的换行符,导致getline函数提取到回车符,结束读取内容,内容为空,    cout<<"请输入你所在的学校名:"<<endl;    cin.getline(school,50);//使用getline函数读取一串字符/*************************************************************************    > File Name: Getc-String.cpp    cin.get函数的调用序列    cin.get(数组名,数组大小);    cin.get()    等价cin.getline(数组名,数组大小) ************************************************************************/    cout<<"你的名字是:"<<name<<endl;    cout<<"你所在学校是"<<school<<endl;    return 0;}

这里写图片描述

cin.get(name,16);与cin.getline(school,50);用法完全一致,唯一区别是在于对于对换行符(用户按回车输入的字符)的处理。getline()在遇到换行符时,将换行符从输入的队列中提取出来,抛弃掉,而get()函数不再提供并抛弃换行符,仍将其留在队列中,在cin.get(name,10);后加cin.get();在输入队列中提取一个字符,也就是把前者遗留在输入队列中的换行符提取出来,否则,如果没有cin.get(); 在执行cin.get(name,10)后,输入队列的第一个字符是换行符,因此,getline()函数会认为已经到达行尾,却没有任何可以读取的内容,所以school将会成为只有一个’\0’的空字符串。因此在使用get()函数是,一定要采用如下调用系列

 cin.get函数的调用序列    cin.get(数组名,数组大小);    cin.get()    等价cin.getline(数组名,数组大小)    等价cin.get(数组名,数组大小).get();

cin与get、getline()函数的搭配问题

#include <iostream>using namespace std;int main(int argc, char *argv[]){    char email[10] ;    char school[15];    cout<<"请输入你的e-mail:"<<endl;    cin>>email;   cin.get();//看到换行符,会认为已经到达行末,没有任何可以读取的内容,加入会只是一个'\0'的空字符串,    cout<<"请输入你的学校名"<<endl;    cin.getline(school,50);    cout<<"e-mail:"<<email<<endl;    cout<<"学校名:"<<school<<endl;    return 0;}

在上边代码中,还没有来得及输入学校名,程序就结束了,问题在于,使用cin读取C分格字符串时或其他用户变量时,用户敲击键盘的换行符留在了输入队列,导致后边的get()或者getline()函数会看到换行符,认为到达行尾,所以没有读到内容,解决办法是在cin>>…的语句后加上cin.get()函数等价于(cin>>…).get();

还有一些我没写,以后有时间再补。