天天看點

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的直接傳回值或許在強制類型轉換時,出了問題吧

繼續閱讀