C++ 输入交流

输入数字

  int num;
  cin >> num ;
  运行后,按照提示输入单个字符,按下Enter键后,输入的数据和换行符进入输入缓冲区。cin对象根据输入需求,从输入缓冲区中提取数字,如果遇到其他非数字字符,则输入结束。
**代码:**

int main()
{
int i= 0 ;
cout << “int 类型字节为 :” << sizeof i << endl << "输入一个数字: ";
cin >> i ;
cout << “输出数字为 :” << i << endl ;
return 0;
}
------------------------------------------------------------------------------------
输出内容1: 输出内容2:
int 类型字节为 :4 int 类型字节为 :4
输入一个数字: 34567987756 输入一个数字: 23245r324
输出数字为 :2147483647 输出数字为 :23245

输出内容3: 输出内容4:
int 类型字节为 :4 int 类型字节为 :4
输入一个数字: 123 456 输入一个数字: 12456
输出数字为 :123 输出数字为 :12456

输出原因分析:
输出内容1 是因为int 类型最大只能存储2147483647 ;
输出内容2和3 都是因为有非数字字符。输出内容2是字母,输出内容3是空格
输出内容4的输出是符合预期的。

在我们输入数字后,需要按Enter键才能将字符送人缓冲区,同时送入缓冲区的有数字和换行符(’\n’).

在程序中添加语句
int main()
{
int i= 0 ;
cout <<“int 类型字节为 :”<<sizeof i << endl << "输入一个数字: ";
cin >> i ;
cout << “输出数字为 :” << i << endl ;
/*添加测试代码------

  • if ( cin.get() == '\n' )
    
  • {
  •    cout << "换行符在缓冲区中" <<endl ;
    
  • }
  • cin.get();   
    
  • */
    return 0;
    }
    输出内容: 对应的语句:
    int 类型字节为 :4 sizeof i
    输入一个数字: 34 cin >> i
    输出数字为 :34 cout << “输出数字为 :” << i << endl
    换行符在缓冲区中 cout << “换行符在缓冲区中” <<endl
    3 cin.get();

在添加测试代码后,if 语句的 cin.get() 从输入缓冲区取得换行符后,输入缓冲区没有数据后, cin.get() 等待用户输入数据。我输入了 3。

输入字符

cin:

代码
int main()
{
char str1[10];
cout << “输入字符串:”;
cin >> str1 ;
cout << "输入字符串为: " << str1 << endl ;
return 0;
}
输出结果1: 输出结果2:
输入字符串:hello c++ 输入字符串:hello ,c+++++
输入字符串为: hello 输入字符串:hello ,c+++++
原因解释: 输出结果1 cin 以空白作为字符串结束标志,所以cin 在缓冲区中取到hello 后就结束输入,在字符数组内存中写入“hello” 并在末尾添加‘\0’ 作为字符串结束标志。 缓冲区中存在 ’ hello’。通过peek()函数来检测缓冲区中仍然存在空格。
if (cin.peek() == ’ ')
cout << “\n空格仍然存在\n”;

输出结果2的输入字符串超过了10,但是仍然输出了全部的字符串。
这是因为数组本身没有对越界进行检查。输出和输入以指针的方式进行。 实际上数组已经越界。所以这种输入方式是不安全的。
可以通过头文件 中的strlen()来检测数组的实际长度。strlen()的计算方式是从数组的第一个元素开始计算字节数,直到遇到空字符。所以未初始化的数组计算其长度是没有意义的。
cout << “字符串的实际数组长度为:” << strlen(str1) << endl;

cin.get() 和cin.getline()

代码:
cin.get()
int main()
{
char str1[5];
cout << “输入字符串:”;
cin.get (str1,5) ;
cout << "输入字符串为: " << str1 << endl ;
cout << “字符串的实际数组长度为:” << strlen(str1) << endl ;
if (cin.peek() == ‘\n’ )
cout << “换行符存在输入缓冲区:” << endl;
return 0;
}
输出内容:-------------------------------------------------------------------------------
输出结果:
输入字符串:qwe
输入字符串为: qwe
字符串的实际数组长度为:3
换行符存在输入缓冲区

cin.getline()
------------------------------------------------------------------------
int main()
{
char str1[5];
cout << “输入字符串:”;
cin.getline (str1,5) ;
cout << "输入字符串为: " << str1 << endl ;
cout << “字符串的实际数组长度为:” << strlen(str1) << endl ;
if (cin.peek() == ‘\n’ )
cout << "换行符存在输入缓冲区: " << endl;

return 0;

}
输出内容: ---------------------------------------------------------------------
输入字符串:q we
输入字符串为: q we
字符串的实际数组长度为:4
--------------------------------------------------------
cin.get (str1,limit) ;或者 cin,getline(str1,limit) 取代 cin >> str1 ;
cin.get() 和cin.getline() 可以取整行的数据,即使中间有空格也可以。
参数limit 代表了字符串str1 最长为limit-1。因为最后一个是结束符’\0’

当输入字符小于limit - 1 时,
cin.get() 会在遇到换行符时,结束输入数据, 并且将换行符留在输入缓冲区。
cin.getline() 在遇到换行符时结束输入数据,但会将换行符转换为字符串结束符。所以缓冲区中没有遗留换行符。

string类

代码:
int main()
{
string TT0 ;
cout << "向string 类型输入字符串: " ;
cin >> TT0;
cout << "字符串为: " << TT0 << endl ;
return 0;
}
cin >>TT0; 语句仍然在检测到空格后停止输入。

输出内容:
向string 类型输入字符串: hello world
字符串为: hello

将getline(cin, TT0); 取代 cin >> TT0;
int main()
{
string TT0 ;
cout << "向string 类型输入字符串: " ;
getline(cin, TT0);
cout << "字符串为: " << TT0 << endl ;
return 0;
}
输出内容:
向string 类型输入字符串: hello world I am
字符串为: hello world I am
最重要的是,string不需要担心数组溢出,字符串长度不需要提前限制。

关键点

1、使用cin 输入数据前会忽略任意数量的空白(tab键 ,Enter键 和空格键)
2、使用cin.peek() 可以偷看输入缓冲区中的字符,而不拿取。
3、当输入类型与期望类型不符合时,设置状态位good 为1 ,在接下来的cin 输入语句中不接受任何输入直接跳过。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值