[英]Why does this program work?
我最近編寫了一個程序,它接受輸入的char數據,測試是否可以接受(az,#標記輸入的結尾)並將其放入堆棧,然后測試它是否是回文。 我希望一次輸入一個字符串,但是如果我輸入一個以磅為單位的字符串,它就可以了。 以下是一些相關代碼:
char buffer;
bool pound_test = false;
bool palindrome = false;
bool keep_going = true;
stack<char> stack1, stack2, stack3;
string str = "";
cout << "Please enter a string, then end it with the pound sign. " << endl;
while(pound_test == false) {
cin >> buffer;
if((buffer >= 97) && (buffer <= 122))
{
stack1.push(buffer);
stack2.push(buffer);
str += buffer;
}
if((buffer >= 65) && (buffer <= 90)) {
buffer = buffer + 32;
stack1.push(buffer);
stack2.push(buffer);
str += buffer;
}
if(buffer == '#')
pound_test = true;
}
因此,當用戶輸入一個長字符串,如“racecar#”並按下回車鍵時,程序會正確地將其放入堆棧中。 我的問題很簡單:為什么? 數據是否必須一次輸入一個char以使其正常工作,因為cin本身就在循環中,並且循環必須重復以將多個字符輸入堆棧,對吧? 謝謝!
編輯:感謝大家的回答/評論! 快速而善意的回復讓我印象深刻。 我肯定會再次使用這個網站。
大多數系統中的控制台輸入(通過cin
std::istream
對象)是行緩沖的。 因此,當您為單個字符調用cin::operator>>
,該函數實際上不會返回,直到您按下換行符(因為基礎I / O系統在此之前不會使數據可用於cin
)。 任何輸入的數據(包括<newline>
都將被緩沖,並且后續對cin::operator>>
調用將從緩沖區中提供服務,直到它耗盡為止。
在這種情況下, cin >> buffer
,其中buffer
的類型為char
將確實獲得單個字符,但在此之前,控制台緩沖整行並將使用它來滿足后續的控制台輸入操作。
如果您在調試器中單步執行代碼,則操作可能會更清晰。
“系統”(操作系統,庫,無論什么 - 取決於實現)吃了來自輸入的數據字符串,但是你的程序用char讀取它。
雖然關於os緩沖的所有答案都是正確的,但我認為混淆可以追溯到cin
的operator >> (char)
; 因為C ++可以根據它們的參數類型重載方法,所以char operator >>
的char版本一次只能分配一個字符,即使整個字符串是緩沖的。 我相信你認為operator >>
應該嘗試將整個字符串放入你的角色; 但由於它“知道”你一次只讀一個字符,所以它一次只能分配一個字符。 我不確定這是否是針對cin的指定行為,但這似乎正在發生的事情。
cin
運算符從標准輸入流中讀取(如果沒有另外配置)。 stdin
工作方式如下:鍵入並按Enter
,它將被發送到stdin
,因此cin
讀取整個字符串直到您按Enter
的那一刻。
如果您希望通過char讀取char,則應使用getchar 。
cin >> buffer;
看到鍵盤輸入的方式cin >> buffer;
不是你的程序的屬性,而是OS,Shell,C運行時的組合,也許是我忘記的千件事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.