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()
-> true
cin.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 |