当前位置:   article > 正文

C++字符输入方式详解_c++输入

c++输入

本文提到的输入方式有:cin cin.get cin.getline gets

一、cin

(1)使用cin输入时要包含头文件iostream。

(2)它从标准输入流中读取对应数据类型的数据,并自动判断读入数据是否有效,可用cin.good()或者cin.fail()来判断

(3)cin语句执行完后不会舍弃最后一个结束符(tab键、空格键、回车键),它被留在缓冲区。

例证

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a1, a2;
  6. cin >> a1 >> a2;
  7. cout << a1 << endl << a2 << endl;
  8. int a3;
  9. a3 = cin.get();
  10. cout << a3;
  11. return 0;
  12. }

可以看到a3是32(空格的ASCll码),说明最后一个结束符没有被丢弃

二、ch=cin.get()与cin.get(ch)

(1)需要包含头文件iostream。

(2)这两个函数是经过重载而得,第一个参数列表为空,其用法是从输入流中读取一个字符并返回该字符的ASCll码,所以这里的ch可以是整型也可以是字符型。

(3)第二个函数的参数列表不为空,为了满足形参实参数据类型一致,这里的ch只能为char型,此函数也表示把输入流的一个字符读入给ch变量。但是它返回的是istream对象,意味着可以使用cin.get(ch1).get(ch2)。一般来讲转换为bool类型用的比较多,当cin.get(ch)没有读到EOF时,返回值bool转换后为true,否则返回false。为了说明两者的区别,请看下例:

char ch;

while((ch = cin.get() ) != EOF) {}        (ch=cin.get())返回的是int型,而EOF为-1,所以该表达式正确

while(cin.get(ch) != EOF) {}        cin.get(ch)返回的是isream不是EOF所以错误

如果要对第二个进行改正,可以改为while(cin.get(ch)){}表示在到达EOF时进入循环,但是不能写while(cin.get(ch)!=false){},除非对cin.get(ch)进行强制bool型转换。

另外还要注意优先级的问题,如下例

while(ch=cin.get()&&ch!='a'){}由于&&的优先级比=高,所以该语句其实等价于while(ch=(cin.get()&&ch!='a'){}

三、cin.get(字符数组名,长度,结束符)与cin.getline(字符数组名,长度,结束符)

(1)需包含头文件iostream

(2)这两个函数都只能对字符数组进行读入(即参数列表第一个必须是字符数组的首地址,也即字符数组名);这两个函数的长度是包含了尾零'\0'的。比如cin.get(arr,5,'\n')其实只输入了4个字符,第五个是'\0'。

(3)不同的是,cin.getline(...)输入完成之后,后面的所有数据全部被抛弃

举例说明cin.getline(...):

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. char a[10];
  6. cin.getline(a, 5, ' ');
  7. cout << a << endl;
  8. int ch1;
  9. ch1 = cin.get();
  10. cout << ch1 << endl;
  11. int ch2;
  12. ch2 = cin.get();
  13. cout << ch2 << endl;
  14. return 0;
  15. }

可见,读了5-1个字符后,后面所有的输入都被丢弃了。

举例说明cin.get(...)

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. char a[10];
  6. cin.get(a, 5, ' ');
  7. cout << a << endl;
  8. int ch1;
  9. ch1 = cin.get();
  10. cout << ch1 << endl;
  11. int ch2;
  12. ch2 = cin.get();
  13. cout << ch2 << endl;
  14. return 0;
  15. }

可见,读了5-1个字符后,并没有丢弃后面的输入。

四、geline(cin,string类型名,结束符)、gets_s(字符数组名,最大读取长度)

(1)C11标准中没有gets函数,因为可能造成缓冲区溢出。可以用gets_s来代替

(2)getline需要包含iostream和string;gets_s包含头文件stdio.h

(3)geline(cin,string类型名,结束符)是string类的输入,所以不指定长度。默认是以回车结束,值得注意的是,它与cin.getline不同,getling函数只丢弃输入结束后面的结束符,结束符后面的输入信息不丢弃。

举例说明:

  1. #include <iostream>
  2. #include <string>
  3. //#include<stdio.h>
  4. int main()
  5. {
  6. using namespace std;
  7. string s;
  8. getline(cin, s, ' ');
  9. cout << s << endl;
  10. int a = cin.get();
  11. cout << a << endl;
  12. int b = cin.get();
  13. cout << b << endl;
  14. return 0;
  15. }

 可以看到只有空格被丢弃了,后面的gh没有被丢弃

(4)gets_s函数只从标准输入中读取,第二个参数为最多读取的长度,一般就是数组的大小。gets_s函数读到的如果超出了字符数组的大小就会报错。像这样

  1. #include<stdio.h>
  2. int main()
  3. {
  4. char a[5];
  5. gets_s(a, 5);
  6. printf("\n");
  7. puts(a);
  8. return 0;
  9. }

 

如果像这样就不会报错(有效输入是5-1)

#---------结束--------#

2022年3月26日

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/798325
推荐阅读
相关标签
  

闽ICP备14008679号