C/C++输入读取数据函数总结

来源:互联网 发布:哪有培训seo 编辑:程序博客网 时间:2024/05/01 04:28
C语言
1、scanf/getchar函数读取字符
scanf/getchar:从输入流缓冲区中读取值,读取时遇到回车(/n)而结束,不舍弃空格、回车字符;

#include <stdio.h>

char ch1, ch2;

scanf("%c", &ch1); 

ch2 = getchar();


2、scanf/gets函数读取字符串
scanf()函数取字符串:遇到回车、空格、TAB就会停止 ,但与读入单个字符不同,输入结束时的空格、回车符被丢弃!

#include <stdio.h>

char str1[20];

scanf("%s",str1); 

printf("%s/n",str1); 

gets()读取字符串:接受空格,如果要读入一个带空格符的字符串时因该用gets(), 而不宜用scanf()!

#include <stdio.h>

char str1[20];

gets(str1); 

printf("%s/n",str1);  第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!

总结
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入,会舍弃最后的回车符!
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!
第二:为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
       这个函数是fflush(stdin)。
方法2:自己取出缓冲区里的残留数据。
(说实话这个语句我也没看懂,呵呵!为什么格式控制是这样的!希望高手指点一下!)

       scanf("%[^/n]",string);

C++

3.1 cin函数

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

输入结束条件   :遇到Enter、Space、Tab键。(这个很重要!)

对结束符的处理 :丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)

#include <iostream>

using namespace std;

读取数字:

int a,b;

cin>>a>>b;

cout<<a+b<<endl;

读取字符:

 char c1, c2;

 cin>>c1;
 cin>>c2;
 cout<<c1<<" "<<c2<<endl;

读取字符串:
char a[20];
cin>>a;
cout<<a<<endl;

3.2.cin.get()函数

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

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


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

输入结束条件:Enter键

对结束符处理:不丢弃Enter,Space字符

#include <iostream>

using namespace std;

char ch;

ch=cin.get(); //或者cin.get(ch);

cout<<ch<<endl;


读取字符串cin.get(array_name, Arsize)是用来读取字符串
输入结束条件:Enter键,按照长度(Arsize)读取字符
对结束符处理:丢弃Enter字符,接受空格字符

#include <iostream>

using namespace std;

char a[20];

cin.get(a, 10);//字符串实际长度+1=10

cout<<a<<endl;

3.2.cin.getline()函数

读取字符串cin.getline(array_name, Arsize)是用来读取字符串(读取方式与cin.get()函数相同)

输入结束条件:Enter键,按照长度(Arsize)读取字符
对结束符处理:丢弃Enter字符,接受空格字符

二者不同:

cin.get(array_name, Arsize)当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。

#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.getline(m[i],20)之类的用法:

#include<iostream>
#include<string>
using namespace std;
main ()
{

char m[3][20];

for(int i=0;i<3;i++)

{

cout<<"\n请输入第"<<i+1<<"个字符串:"<<endl;

cin.getline(m[i],20);

}

cout<<endl;

for(int j=0;j<3;j++)

cout<<"输出m["<<j<<"]的值:"<<m[j]<<endl;

}
请输入第1个字符串:
kskr1
请输入第2个字符串:
kskr2
请输入第3个字符串:
kskr3
输出m[0]的值:kskr1
输出m[1]的值:kskr2
输出m[2]的值:kskr3

4、getline() // 接受一个字符串,可以接收空格并输出,需包含“#include<string>”
#include<iostream>
#include<string>
using namespace std;
main ()
{
string str;
getline(cin,str);
cout<<str<<endl;
}
输入:jkljkljkl
输出:jkljkljkl
输入:jkl jfksldfj jklsjfl
输出:jkl jfksldfj jklsjfl

和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数
5、gets() // 接受一个字符串,可以接收空格并输出,在C++程序中需包含“#include<string>”
#include<iostream>
#include<string>
using namespace std;
main ()
{
char m[20];
gets(m); //不能写成m=gets();
cout<<m<<endl;
}
输入:jkljkljkl
输出:jkljkljkl
输入:jkl jkl jkl
输出:jkl jkl jkl
类似cin.getline()里面的一个例子,gets()同样可以用在多维数组里面。
0 0
原创粉丝点击