在这里总结一下C和C++的字符读取函数的使用,主要是我每次要用的时候都会出现概念混乱,在这里做小结以便今后在用的时候能迅速回忆并使用。


C

scanf()函数

还是要先从C语言说起,这部分在《C Primer Plus》讲解的很详细。

scanf()的工作

scanf可以读取各种格式的数据,scanf的工作是将输入逐个字符的转换成其他格式数据(int, float, char, C字符串)

scanf()的工作过程

对于scanf()工作过程重要的一点是scanf()会跳过空白字符,空白字符包括空格、制表符、换行符。直到遇到符合要求的字符,然后进行格式转换并存入到相应的变量中。

如果格式不匹配,scanf()会认为已经到达相应格式数据的结尾,并把最后一次读取的不符合格式要求哦字符放回输入,然后停在那里,等程序再次调用scanf()时再重复上述过程继续读取。因此流程总结大致为:

  1. 逐字符读取字符,直到遇到不符合格式说明符的字符;
  2. 若遇到不符合的字符,将该字符放回输入,scanf()停止读取;
  3. scanf()将读取的字符转换成相应格式数据并存储到对应变量中
  4. 程序调用继续重复1、2、3过程读取数据

%s%c格式

  • %s时,scanf()仍然会跳过空白字符,但其他字符都一视同仁了。
  • %c时所有字符全部平等,不会跳过空白字符!!

返回值

scanf()返回成功读取项目的个数。

  • 当没有读取任何数据的时候,返回0
  • 检测到文件结尾的时候返回EOF(-1)

getchar()函数

scanf()类似, 调用方式:

1
2
char ch;
ch = getchar();

getc()函数

工作方式和getchar()类似,但是可以指定使用的文件

1
2
3
FILE * fp;
// get fp...
ch = getc(fp);

其中,

1
ch = getc(stdin); // 与 ch = getchar()等价



C++

使用原始的cin对象进行输入

1
2
char ch;
cin >> ch;

不过直接使用cin的话,cin会在读取字符的时候跳过空字符,因此see you later回显以后会是seeyoulater

这里和C中的`scanf("%c", &ch)`不同,cin >> ch依旧会跳过空格和换行符而不是像scanf读取字符时候一视同仁

cin.get(ch)

此方法将参数ch声明为引用,然后给赋值,此方法不会跳过空字符

cin.get(ch)方法的文件尾条件

若读到文件尾,也就是检测到EOF后cineofbitfailbit都设为1,可以分别通过cin.eof()cin.fail()调用获取
也就是
cin.eof() -> true
cin.fail() -> true

输入错误和EOF都将导致cin返回false

另外,由于这个函数的返回值仍为cin对象,cin对象很神奇会在需要bool的时候自动从istream对象转换成bool型数值。因此可以直接将cin放入条件判断语句中。如:

1
2
3
char 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

Comments