我正在阅读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
#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;
}
我无法弄清楚原因:(
答案 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