簡體   English   中英

為什么這個程序有效?

[英]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緩沖的所有答案都是正確的,但我認為混淆可以追溯到cinoperator >> (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM