关于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();
还有一些我没写,以后有时间再补。
- 关于c++和C的getXXX系列函数
- struts2的debug标签和getXxx方法
- 关于C和C++中空参数表的函数的解释
- 关于C语言中的malloc和free函数的用法
- 关于C语言的函数调用过程和数组越界
- 关于C语言中的malloc和free函数的用法
- 关于 C C++ 可变参数的 宏 和 函数
- C中关于字符串和字符的处理函数
- C语言中关于gets和scanf函数的理解
- C/C++中关于qsort和sort函数的使用
- C语言关于localtime_s()和asctime_s()两个函数的用法。
- C和指针_关于输入输出函数的整理
- 关于C语言和Javascript函数参数的传递
- C字符串函数系列
- C字符串函数系列
- 关于C函数
- C++:关于构造函数
- 【C++】关于指针函数
- springboot提示No identifier specified for entity
- 12.11学习心得
- 91. Decode Ways
- 结构体的存储分配问题
- 机器学习笔记(V)线性模型(I)一维最小二乘法
- 关于c++和C的getXXX系列函数
- DataStructureProject(3)
- linux基本操作---用户以及文件权限
- Dagger2 同时引用多个 Module 的三种写法
- Lvs+Ldirectord+Heartbeat
- canvas雨滴绘制总结(三)
- IO流(12)--装饰设计模式
- 替换死亡节点(三)
- Latex 公式太长等号对齐,argmin 符号在正下方,