c++最全输入函数cin, cin.get(), cin.getline(), getline()和getchar()的具体用法和详解!!!

2,359 阅读7分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情

cin >>(在头文件<iostream>)

结束条件: 回车,空格,tab

用法: cin >> 变量

处理方法: cin从输入缓冲区中读取符合目标变量类型的字符,数字等,直到遇到结束符停止当前读入。

关键点:

  1. cin是不接收:回车,空格,tab(即下一个cin不会读入上一个cin所遗留的结束符,而是跳过往下读入)。
  2. 缓冲区中的回车不会被舍弃。
  3. 只有遇到回车 (其他结束符不行),且所有的cin在输入缓冲区中都读到了相应的内容,才会把cin从输入缓冲区中读出的内容读入到相应变量中。

cin.get()(在头文件<iostream>)

方式:0 参数的形式

结束条件: 输入的字符数量满足所有使用该函数的变量读取后,再回车即可结束 (由于它可以接收回车,所以回车也算一个字符).

用法: cin.get()

返回值: 字符的ASCII

处理方式: 仅从输入流中读取一个字符,并且返回该字符的ASCII

关键点:

  1. 可以接收空格,tab,回车。
  2. 缓冲区中的回车不会被舍弃,会继续被下一个读入函数所使用。

方式:1 参数的形式

结束条件: 输入的字符满足所有使用该函数的变量读取后,再回车即可结束 (由于它可以接收回车,所以回车也算一个字符).

用法: cin.get(字符变量)

返回值: cin流对象

处理方法: 仅从输入流中读取一个****字符并将该字符赋值给传入的变量

关键点:

  1. 可以接收空格,tab,回车。
  2. 缓冲区中的回车不会被舍弃,会继续被下一个读入函数所使用。
  3. 由于返回值是cin流对象,所以可以采用链式调用多个get函数。

方式:2 参数的形式

结束条件: 遇到回车即可结束

用法: cin.get(字符数组, 读入字符数量n)

返回值: cin流对象

处理方法:2参数的形式,get函数处理起来会比较特殊,例如:cin.get(字符数组, n) ,则仅从输入流中读取 n-1个字符,字符数组末尾会用 '\0'补充

关键点:

  1. 可以接收空格,tab (回车不行)。
  2. 若一开始就以回车结束,则最后的结束符回车在缓冲区中将会被舍弃。
  3. 当**读入字符数量n **大于字符数组的实际长度的时候,系统会自动扩张数组的长度使其可以放入更多的字符(但仅限打印,实际字符数组空间并未改变),当然不建议这么做。
  4. 由于返回值是cin流对象,所以可以采用链式调用多个get函数。
  5. 当输入的实际字符个数少于n-1的时候回车结束,这时不足的部分会自动用 '\0'补充。

方式:3 参数形式

结束条件: 输入的字符数量达到了n-1或者遇到了第三个参数(自定义的截断符),再回车即可结束 (其中n为传入的第二个参数,表示读入字符数量);

用法: cin.get(字符数组, 读入字符数量n, 自定义截断符s)

返回值: cin流对象

处理方式: 从输入流中读取字符,但仅从输入流中读取n-1个字符,字符数组末尾会用 ‘\0’补充,当遇到了自定义的截断符时,会停止后面字符读入数组中,并且截断字符也不会读入。

关键点:

  1. 可以接收空格,tab,回车。
  2. 当**读入字符数量n **大于字符数组的实际长度的时候,系统会自动扩张数组的长度使其可以放入更多的字符(但仅限打印,实际字符数组空间并未改变),当然不建议这么做。
  3. 由于返回值是cin流对象,所以可以采用链式调用多个get函数。
  4. 遇到了截断符s,截断对后面字符的读入,并且缓冲区中的截断符s也会被舍弃。
  5. 缓冲区中的回车不会被舍弃,会继续被下一个读入函数所使用。
  6. 当输入的实际字符个数少于n-1的时候回车结束,这时不足的部分会自动用 '\0'补充。

cin.getline() (在头文件<iostream>)

方式:2 参数形式

结束条件: 遇到回车即可结束

用法: cin.getline(字符数组,读入字符数量n)

返回值: cin流对象

处理方式: 从输入流缓冲区中读取n-1个字符到字符数组中,字符数组末尾会用 '\0'补充

关键点:

  1. 可以接收空格,tab (回车不行)。
  2. 由于返回值是cin流对象,所以可以采用链式调用。
  3. 输入流缓冲区中,从结束符开始(包括结束符)全部清空,所以不要在它后面写相关的读取输入流的函数的代码。
  4. 当输入的实际字符个数少于n-1的时候回车结束,这时不足的部分会自动用 '\0'补充。
  5. 当**读入字符数量n **大于字符数组的实际长度的时候,仍然只会读入输入流中的前n-1个字符。

方式:3 参数形式

结束条件: 遇到回车即可结束

用法: cin.getline(字符数组,读入字符数量n, 自定义截断符s)

返回值: cin流对象

处理方式: 从输入流缓冲区中读取n-1个字符到字符数组中,字符数组末尾会用 '\0'补充,当遇到了自定义的截断符时,会停止后面字符读入数组中,并且截断字符也不会读入。

关键点:

  1. 可以接收空格,tab (回车不行)。
  2. 由于返回值是cin流对象,所以可以采用链式调用。
  3. 输入流缓冲区中从,结束符开始(包括结束符)全部清空,所以不要在它后面写相关的读取输入流的函数的代码。
  4. 当输入的实际字符个数少于n-1的时候回车结束,这时不足的部分会自动用 '\0'补充。
  5. 遇到了截断符s,截断对后面字符的读入,并且缓冲区中的截断符s也会被舍弃。
  6. 当**读入字符数量n **大于字符数组的实际长度的时候,仍然只会读入输入流中的前n-1个字符。

getline() (在头文件<string>)

结束条件: 遇到回车即可结束

用法: getline(cin,字符串str)

返回值: cin流对象

处理方式: 从输入流缓冲区中读取字符直到遇到回车结束

关键点

  1. 可以接收空格,tab (回车不行)。
  2. 由于返回值是cin流对象,所以可以采用链式调用。
  3. 缓冲区中的结束符会被舍弃。所以一般用它来读取一整行字符串。
  4. 不会在字符串末尾添加 '\0'

getchar() (在头文件<iostream>)

结束条件: 遇到回车即可结束

用法: getchar()ch = getchar() 其中ch为字符型或整型

返回值: 字符的ASCII

处理方式: 仅从输入流缓冲区中读取一个字符直到遇到回车结束

关键点:

  1. 可以接收空格,tab,回车。
  2. 缓冲区中的结束符不会被舍弃。
  3. 如果没有用循环的话,getchar()每次只能从输入流中读取一个字符。