天天看点

C++下ctrl+z退出cin输入循环

ctrl+z 退出输入的循环结构

    • 测试的语言及工具
    • for循环
    • while循环
    • do while循环
    • 进一步探究ctrl+z在变量内部储存为什么
    • 几天后的继续

测试的语言及工具

C++

visual studio 2017

for循环

这是我们学校上课提供的C++教材书(C++语言程序设计–刘瑞芳)上的例子,看得我一脸懵逼,于是进行了这次测试

代码如下

int value=0, sum=0;
	for (; cin >> value;)
		sum += value;
           

测试结果:

C++下ctrl+z退出cin输入循环

while循环

while循环里面总不能什么都不做吧,于是放了个cout<<i

代码如下

int a[10], i(0);
	while (cin>>(a[i])) {
		cout << "i的值为" << i << endl;
		i++;
	}
           

测试结果:

C++下ctrl+z退出cin输入循环

结论:while可以通过ctrl+z结束循环

do while循环

first trying 失败

代码如下

int a[10], i(0);
	cin >> (a[i]);
	do{
		cin >> (a[i]);
	} while (true);
           

测试结果:

C++下ctrl+z退出cin输入循环

结果分析

while(true)死循环

emmmm貌似不是真正原因,真正原因再与ctrl+z后卡死,不能输入,也没有结束,蒙圈

接下来查资料时间,查阅多方资料后发现一个很在理,ctrl+z结束输入流,Ta说的其他的原因分析就懂不大起了

在另外一些人的资料中还发现个好东西,ctrl+z相当于EOF(别人说的,自己测试了,非也)

也就是说之前的我并没有理解到ctrl+z退出循环的精髓,其实是输入后判断ctrl+z(目前知识水平只允许我这样理解 啊哈) 所以代码应该这样写:

second trying

代码如下

int a[10], i(0);
	cin >> (a[i]);
	do{
		cout << "i的值" << i << endl;
		i++;
	} while (cin >> (a[i]));
           

测试结果:

C++下ctrl+z退出cin输入循环

回看for循环再分析

代码

int value=0, sum=0;
	for (; cin >> value;)
		sum += value;
           

测试结果:

C++下ctrl+z退出cin输入循环

for循环中

cin >> (a[i])

的位置刚好在判断退出循环的位置,所以能够退出循环

回看while循环再分析

测试ctrl+z在变量中的值

代码如下

int a[10], i(0);
	while (cin>>(a[i])) {
		cout << "i的值为" << i << endl;
		i++;
	}
	cout << a[i] << endl;
           

测试结果:

C++下ctrl+z退出cin输入循环

结果分析

输出有点奇怪,不急,看样子有点像随机数,可以先初始化一下数组的值全部为6(随便的啦)

a[10] = {6}, i(0);
	while (cin >> (a[i])) {
		cout << "i的值为" << i << endl;
		i++;
	}
	cout << a[i] << endl;
           

测试结果:

C++下ctrl+z退出cin输入循环

emmmm出了点意外,不急,最后一招,visual studio调试界面局部变量窗口查看局部变量的值

C++下ctrl+z退出cin输入循环

基础不牢地动山摇啊,这样初始化只会把a[0]初始化为6,其余为0,这下原因就对了

ctrl+z并不会cin到变量

进一步探究ctrl+z在变量内部储存为什么

cin >> intA方式

代码如下

int value;
	cin >> value;
	cout << value << endl;
           

测试结果:

C++下ctrl+z退出cin输入循环

结果分析

为随机数,证明没有真正输入进去

cin >> charA方式

代码如下

char value;
	cin >> value;
	cout << value << endl;
           

测试结果:

C++下ctrl+z退出cin输入循环

结果分析

空白 呃 这就没办法了visual studio调试走一波

C++下ctrl+z退出cin输入循环

原来还是没有输进去

intA = cin.get() 方式

代码如下

int value;
	value=cin.get();
	cout << value << endl;
           

测试结果:

C++下ctrl+z退出cin输入循环

出乎意料的结果

再试一下如果是char类型的会是怎样的结果

代码如下

char value;
	value=cin.get();
	cout << value << endl;
           

测试结果:

C++下ctrl+z退出cin输入循环

空白?? 这就没办法了,emmm今天先试到这里,书屋要关门了 …

几天后的继续

前几天这个cin读入ctrl+z又出了幺蛾子

代码如下

#include<iostream>
using namespace std;
int main()
{
	int space_num = 0, digital_num = 0, character_num = 0;
	char c;
	while (c=cin.get())
		if (c == ' ')
			space_num++;
		else if ((c >= '0') && (c <= '9'))
			digital_num++;
		else if (((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'Z')))
			character_num++;
	}
	cout << "空格个数" << space_num << endl;
	cout << "数字个数" << digital_num << endl;
	cout << "字母个数" << character_num << endl;
	system("pause");
	return 0;
}
           

输入ctrl+z后死循环,然后呆了几天没有进展

直到看了另外一本参考书

C++下ctrl+z退出cin输入循环

试了一下cin.get(ch)

代码如下

#include<iostream>
using namespace std;
int main()
{
	int space_num = 0, digital_num = 0, character_num = 0;
	char c;
	while (cin.get(c))
		if (c == ' ')
			space_num++;
		else if ((c >= '0') && (c <= '9'))
			digital_num++;
		else if (((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'Z')))
			character_num++;
	}
	cout << "空格个数" << space_num << endl;
	cout << "数字个数" << digital_num << endl;
	cout << "字母个数" << character_num << endl;
	system("pause");
	return 0;
}
           

一下就正常退出循环了。

看了一下书上的解释,说是cin将输入流状态码设置成了failbit

感觉更像是将cin状态码设置成了eofbit,但在看到源码之前这些都是我的个人猜测吧

至于为什么一个能退出循环一个不能,我想原因在于一个判断字符存的值(vs调试局部变量窗口下显示此时ASCII码值为-1,奇怪), 一个判断cin的直接返回值或许在强制类型转换时,出了问题吧

继续阅读