C & C++字符读取总结
在这里总结一下C和C++的字符读取函数的使用,主要是我每次要用的时候都会出现概念混乱,在这里做小结以便今后在用的时候能迅速回忆并使用。
C
scanf()函数
还是要先从C语言说起,这部分在《C Primer Plus》讲解的很详细。
scanf()的工作
scanf可以读取各种格式的数据,scanf的工作是将输入逐个字符的转换成其他格式数据(int, float, char, C字符串)
scanf()的工作过程
对于scanf()工作过程重要的一点是scanf()会跳过空白字符,空白字符包括空格、制表符、换行符。直到遇到符合要求的字符,然后进行格式转换并存入到相应的变量中。
如果格式不匹配,scanf()会认为已经到达相应格式数据的结尾,并把最后一次读取的不符合格式要求哦字符放回输入,然后停在那里,等程序再次调用scanf()时再重复上述过程继续读取。因此流程总结大致为:
- 逐字符读取字符,直到遇到不符合格式说明符的字符;
- 若遇到不符合的字符,将该字符放回输入,
scanf()停止读取; scanf()将读取的字符转换成相应格式数据并存储到对应变量中- 程序调用继续重复1、2、3过程读取数据
%s和%c格式
%s时,scanf()仍然会跳过空白字符,但其他字符都一视同仁了。%c时所有字符全部平等,不会跳过空白字符!!
返回值
scanf()返回成功读取项目的个数。
- 当没有读取任何数据的时候,返回0
- 检测到文件结尾的时候返回EOF(-1)
getchar()函数
和scanf()类似, 调用方式:1
2char ch;
ch = getchar();
getc()函数
工作方式和getchar()类似,但是可以指定使用的文件1
2
3FILE * fp;
// get fp...
ch = getc(fp);
其中,
1
ch = getc(stdin); // 与 ch = getchar()等价
1 | ch = getc(stdin); // 与 ch = getchar()等价 |
C++
使用原始的cin对象进行输入
1 | char ch; |
不过直接使用cin的话,cin会在读取字符的时候跳过空字符,因此see you later回显以后会是seeyoulater。
cin.get(ch)
此方法将参数ch声明为引用,然后给赋值,此方法不会跳过空字符
cin.get(ch)方法的文件尾条件
若读到文件尾,也就是检测到EOF后cin将eofbit和failbit都设为1,可以分别通过cin.eof()和cin.fail()调用获取
也就是cin.eof() -> truecin.fail() -> true
输入错误和EOF都将导致
cin返回false
另外,由于这个函数的返回值仍为cin对象,cin对象很神奇会在需要bool的时候自动从istream对象转换成bool型数值。因此可以直接将cin放入条件判断语句中。如:1
2
3char ch;
cin.get(ch);
while(cin){...};
ch = cin.get()方法
此方法与C语言的getchar()类似,会返回读取的字符值。但是这里的返回值是int类型数值。
cin.get(ch) VS cin.get()
| 属性 | cin.get(ch) |
ch=cin.get() |
|---|---|---|
| 传递输入字符的方式 | 赋值给参数ch |
将参数返回值赋值给ch |
| 用于字符输入时函数的返回值 | istream对象(执行bool转换后为true) |
int类型的字符编码 |
到达EOF时函数的返回值 |
istream对象(执行bool转换后为false) |
EOF |