C ++与cin和CTRL + Z的问题

时间:2014-09-10 13:16:52

标签: c++ windows eof cin


我正在阅读c ++ primer 5th,我对练习有一点问题:

  

从cin中读取一系列单词并将值存储为向量。后   你已经阅读了所有单词,处理了向量并将每个单词更改为   大写。将变换后的元素,八个单词打印到一行。

我的代码是这样的:

#include <iostream>
#include <vector>
#include <string>
#include <cctype>

using std::vector;
using std::string;
using std::cin;
using std::cout;
using std::endl;

int main(){

    vector<string> words;
    string wordBuffer;
    vector<string> output(1);

    while (cin >> wordBuffer){
        words.push_back(wordBuffer);
    }

    for (string &word : words){
        for (char &letter : word){
            letter = toupper(letter);
        }
    }

    unsigned currentLine = 0;
    for (decltype(words.size())index = 0; index < words.size(); ++index){

        output[currentLine] += words[index] + " ";

        if ((index+1) % 8 == 0){
            ++currentLine;
            output.push_back("");
        }

    }

    for (string s : output){
        s[s.size() - 1] = 0; //removing the whitespace
        cout << s << endl;
    }

    system("pause");
    return 0;
}

现在,一切运行良好,但我对控制台输入的单词有疑问。
如果我写

  

我正在写一个随机的词^ Z

并按 Enter 没有任何反应。我按下 Enter 之后我必须重写^ Z,就像这里:

  

我正在写一个随机的词   ^ Z

你可以告诉我为什么吗?谢谢!

PS:我说的是因为在我之前的程序中,在同一行中编写^ Z工作得很好。就像在这段代码中一样:

#include <iostream>;


int main(){
    int currval = 0,val = 0;

        int count = 1;
        while (std::cin >> val){
            if (currval == val){
                ++count;
            }
            else {
                std::cout << "The number " << currval << " appears " << count << " times" << std::endl;
                currval = val;
                count = 1;
            }
        }
        std::cout << "The number " << currval << " appears " << count << " times" << std::endl;

    system("pause");

    return 0;
}

我无法弄清楚原因:(

2 个答案:

答案 0 :(得分:4)

^ Z必须首先让Windows将其视为 Ctrl + Z ,否则它只会被视为无意义的字符。

如果你希望它像你写的那样工作我建议:

String wordBuffer("")
while (strcmp(wordBuffer[strlen(wordBuffer)-3], "^Z") != 0){
    words.push_back(wordBuffer);
    cin >> wordBuffer
}

编辑:在你的第二个例子中它起作用,因为当你读取整数时,c ++知道在空格中划分给定的数字串(或者如果输入数字,则为 ENTER 分别在每一行中)分别读取每个数字,如果你输入:

123 2323 4545 43 ^Z

它将读取123,然后是2323,...然后^ Z,所以它就好像它在一个单独的行中得到它但是当你读取字符串时,它不能这样做因为一个字符串包含每个符号所以它将 ENTER 中的输入分开,以及第二个输入的原因

答案 1 :(得分:0)

据我所知 Ctrl + Z 在任何其他输入符号之前放置在键盘缓冲区中。因此,在 Ctrl + Z 之前输入的任何字符都将被丢弃。您需要执行以下操作

I am writing a random words  ENTER
^Z ENTER