原型:int scanf(const char *restrict format,......);
入口参数:第一个参数是格式字符串,它指定了输入的格式,......格式化后的字符串存取地址。
返回值:函数返回值为int类型,如果读取到了“文件结束”则返回EOF,EOF为Ctrl+z或者Ctrl+d。其他情况则返回int型数字,例如:int res = scanf("%d %d",&a,&b);如果a,b都读取成功,则返回2;如果a,b只读取成功了一个,则返回1;如果a,b都没有读取成功,则返回0.
说明:scanf()函数是C语言库中的函数,但由于C++的向下兼容性,所以在C++中也可以使用此函数。次函数是从标准输入流stdio(一般是键盘输入)中读取数据,并将其按照指定格式输入到制定地址。
scanf()函数遇到空格、换行和Tab键都会认为输入结束(不读取)。但是scanf("%c",&i)等价于i = getchar(),空格、tab和换行符都会被读入。
头文件:#include <stdio.h>
用例:
#include <stdio.h> #include <iostream> using namespace std; int main() { int a,b; scanf("%d %d",&a,&b); //注意此处输入的格式,两个输入数字之间要以空格分隔开来。 printf("%d %d",a,b); }
---------------------------------------------------------------------
2.cin()类(此类命名空间都在std中,无需添加头文件)。
2.1.cin>>函数
说明:当我们从键盘输入时,有一个缓冲区,当输入结束时会将所输入的数据存到缓冲区。而cin>>的作用就是从缓冲区读数据,所以当缓冲区数据本来就有残留时,会出现读取出错的问题。值得一提的是:cin函数遇到空格、TAB、换行时读取结束(不读取)。
用例:
输入一个字符串。
#include <iostream> using namespace std; void main () { char a[10]; cin>>a; cout<<a<<endl; }
输入:aaabbbccc
输出:aaabbbccc
输入:aaa bbb ccc
输出:aaa
---------------------------------------------------------------------
2.2.cin.get()函数
原型:该函数有三种形式,分别是char ch = cin.get(), cin.get(char ch), cin.get(array,length)。
1.cin.get() 和 cin.get(char ch)的用法
这两个函数功能基本一样,都是读取缓冲区的一个字符,遇到换行符结束,这两个函数会读取空格、tab和换行符。char ch = cin.get(), cin.get(char ch)这两句可得到相同的结果。
一般使用cin.get(ch),因其更符合对象方式,返回值是istream对象,这意味着可以讲它们拼接起来:cin.get(ch1).get(ch2);
用例:
#include <iostream> using namespace std; void main() { char ch1,ch2; cin.get(ch1); ch2 = cin.get(); cout<<ch1<<endl; cout<<ch2<<endl; }
输入:a换行
输出:a
(此处有一行空行,因为不会丢弃缓冲区里边的空行)
---------------------------------------------------------------------
2.cin.get(char* array, int length)
这个函数是从缓冲区读取字符串,其中array是字符串接受地址,length-1是字符串长度,因为最后一个字符必须存储‘\0‘结束符,所以此函数只能接受length-1个字符。会读取空格、tab和换行符,遇到换行符结束,并将换行符转化为‘\0‘,但是不会丢弃缓冲区里边的换行符。
用例:
#include <iostream> using namespace std; void main() { char ch[5]; cin.get(ch,5); cou<<ch<<endl;//可存入4个字符
//char *ch2;
//cin.get(ch2,12);//可存入11个字符
}
输入:abcdefghi
输出:abcd
---------------------------------------------------------------------
2.3.cin.getline(char* str,int length)函数
说明:接收一个长度为length-1的字符串,包括空格、tab和换行符,遇到换行符结束,并将换行符转化为‘\0‘。与cin.get()类似。
#include<iostream> using namespace std; int main() { char ch[10]; cin.getline(ch,5); cout<<ch<<endl; return 0; }
输入:aaaaaaaa
输出:aaaa
cin.get和cin.getline的区别:
分为三种情况来看:
1)输入的字符串不超过限定大小
get(str,Size):读du取所有zhi字符,遇到‘\n‘时止,并且将‘\n‘留在输入缓冲区dao中,其将被下一个读取输入的操作捕获,影响该输入处理;
getline(str,Size):读取所有字符,遇到‘\n‘时止,并且将‘\n‘直接从输入缓冲区中删除掉,不会影响下面的输入处理。
2)输入的字符数超出限定的大小
get(str,Size):读取Size-1个字符,并将str[Size-1]置为‘\0‘,然后将剩余字符(包括‘\n‘)留在输入缓冲区中,这些字符将被下一个读取输入的操作捕获,影响该输入处理;
getline(str,Size):读取Size-1个字符,并将str[Size-1]置为‘\0‘,剩余字符(包括‘\n‘)留在输入缓冲区中,随即设置cin实效位(即if(!cin)的判断为真),关闭输入。其后的所有输入都无法得到任何东西,当然也无法得到输入缓冲区中剩余的字符串。但如果用clear()重置cin,其后的输入便可用并会得到遗留在输入缓冲区中的字符。
3)输入一个空行(即直接回车)
get(str,Size):str将得到‘\0‘,并设置cin实效位,关闭输入,但回车依然留在输入缓冲区中,因此如果我们用clear()重置cin,其下一个读取输入的操作将捕获‘\n‘;
getline(str,Size):str将得到‘\0‘,并将‘\n‘删除掉,不置实效位,不关闭输入。所以对于cin.getline来说空行是合法的输入,且不会影响下面的输入处理。
至于使用那个更好,可能因人习惯不同而不同,仁者见仁智者见智。
---------------------------------------------------------------------
3.getline()函数
getline()和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数。
原型:ssize_t getline(char **lineptr,size_t *n,FILE *stream);(在C语言的GCC扩展定义中)
getline(cin,string s);(在C++中)
说明:getline不是C语言的库函数,而是GCC的扩展定义或者C++库函数,在C语言中和C++中的使用是不同的。
在C++中,应包含头文件<string>,读取字符串包含空格、tab和换行符,遇到换行符结束,并将换行符转化为‘\0‘。
用例:
#include <iostream> using namespace std; int main() { string s; getline(cin,s); cout<<s<<endl; return 0; }
输入:abcdefgh换行
输出:abcdefgh
---------------------------------------------------------------------
4.gets()函数
原型:char *gets(char *buffer);
入口参数:从缓冲区读取字符串后的写入地址
返回值:读取成功后返回与入口参数buffer相同的地址。读取错误返回NULL。
头文件:<string>
说明:接收输入的字符串,没有上限,但是要保证buffer足够大,以换行结束,并将换行符转化为‘\0‘。能读取空格、tab与回车。
用例:
#include<iostream> #include<string> using namespace std; int main() { char ch[10]; gets(ch); cout<<ch<<endl; return 0; }
输入:abcdefg回车
输出:abcdefg
---------------------------------------------------------------------
5.getchar()函数
原型:int getchar(void);
返回值:读取成功返回用户输入的ASCII码,读取失败返回EOF.
头文件:<string>或者<stdio.h>
说明:接收一个字符的输入,包含空格、tab和换行,遇到换行符结束。
#include<iostream> #include<string> using namespace std; int main() { char ch; ch = getchar(); cout<<ch<<endl; return 0; }
输入:(空格)abc回车
输出:(空格)
---------------------------------------------------------------------
小结:
只能处理字符(char c):cin.get(c),c=cin.get(),c=getchar()。可读取空格、tab和换行符,遇到换行符结束。
只能处理字符串(char* ch):cin.get(ch,length),cin.getline(ch,length),gets(ch)。能读取空格、tab和换行符,遇到换行符结束,并将换行符转化为‘\0‘。
只能处理string类型(string str):getline(cin, str)。能读取空格、tab和换行符,遇到换行符结束,并将换行符转化为‘\0‘。
能处理char和char*:scanf。scanf通常不能读取空格和tab,只能在处理char字符时可以读取空格、tab和换行符:scanf("%c",&ch),此时遇到换行符结束。
都能处理:cin,cin不可读取空格、tab和换行符,遇到空格、tab和换行符结束。
若要读取空格或者tab,对于char型用c=getchar(),char*型用gets(ch),string型用getline(cin, str)。
其中gets函数可能不被支持,易报错,替换方案cin.get(ch,length)和cin.getline(ch,length)又需要指定长度,有时不方便,因此推荐使用char型和string型的解决方案。