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;
測試結果:

while循環
while循環裡面總不能什麼都不做吧,于是放了個cout<<i
代碼如下
int a[10], i(0);
while (cin>>(a[i])) {
cout << "i的值為" << i << endl;
i++;
}
測試結果:
結論:while可以通過ctrl+z結束循環
do while循環
first trying 失敗
代碼如下
int a[10], i(0);
cin >> (a[i]);
do{
cin >> (a[i]);
} while (true);
測試結果:
結果分析
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]));
測試結果:
回看for循環再分析
代碼
int value=0, sum=0;
for (; cin >> value;)
sum += value;
測試結果:

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;
測試結果:
結果分析
輸出有點奇怪,不急,看樣子有點像随機數,可以先初始化一下數組的值全部為6(随便的啦)
a[10] = {6}, i(0);
while (cin >> (a[i])) {
cout << "i的值為" << i << endl;
i++;
}
cout << a[i] << endl;
測試結果:
emmmm出了點意外,不急,最後一招,visual studio調試界面局部變量視窗檢視局部變量的值
基礎不牢地動山搖啊,這樣初始化隻會把a[0]初始化為6,其餘為0,這下原因就對了
ctrl+z并不會cin到變量
進一步探究ctrl+z在變量内部儲存為什麼
cin >> intA方式
代碼如下
int value;
cin >> value;
cout << value << endl;
測試結果:
結果分析
為随機數,證明沒有真正輸入進去
cin >> charA方式
代碼如下
char value;
cin >> value;
cout << value << endl;
測試結果:
結果分析
空白 呃 這就沒辦法了visual studio調試走一波
原來還是沒有輸進去
intA = cin.get() 方式
代碼如下
int value;
value=cin.get();
cout << value << endl;
測試結果:
出乎意料的結果
再試一下如果是char類型的會是怎樣的結果
代碼如下
char value;
value=cin.get();
cout << value << endl;
測試結果:
空白?? 這就沒辦法了,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後死循環,然後呆了幾天沒有進展
直到看了另外一本參考書
試了一下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的直接傳回值或許在強制類型轉換時,出了問題吧