我在使用C ++"编写原理和练习时,从特定的代码片段中遇到了困难。
我无法从引用向量的循环中获得输出。我使用std_lib_facilities和stdafx,因为这本书和MVS告诉了我。
#include "stdafx.h"
#include "../../std_lib_facilities.h"
int main()
{
vector<string>words;
for(string temp; cin>>temp; )
words.push_back(temp);
cout << "Number of words: " << words.size() << '\n';
}
这不会产生任何结果。我会得到提示,键入一些字,然后输入,然后什么也没有。
尝试了我在这里以及其他网站上的一些变体,例如:
//here i tried the libraries the guy used in his code
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
cout << "Please enter a series of words followed by End-of-File: ";
vector<string> words;
string word;
string disliked = "Broccoli";
while (cin >> word)
words.push_back(word);
cout << "\nNumber of words: " << words.size() << endl;
// cycle through all strings in vector
for (int i = 0; i < words.size(); ++i)
{
if (words[i] != disliked)
cout << words[i] << endl;
else
cout << "BLEEP!\n";
}
return 0;
}
仍然没有。
在尝试了一些事情之后,通过消除,我很确定问题在于循环到矢量通信,因为所有这些都可以正常工作:
int main()
{
vector<string>words = { "hi" };
words.push_back("hello");
cout << words[1] << "\n"; // this will print hello
for (int i = 0; i < words.size();++i) {
cout << words[i] << "\n"; // this will print out all elements
// inside vector words, ( hi, hello)
}
cout << words.size();// this will print out number 2
for (string temp; cin >> temp;) {
words.push_back(temp);
}
cout << words.size();// this won't do anything after i type in some
// words; shouldn't it increase the size of the
// vector?
}
这两者都不会:
int main()
{
vector<string>words = { "hi" };
for (string temp; cin >> temp;) {
words.push_back(temp);
}
cout << words.size();
}
我错过了什么?提前谢谢。
答案 0 :(得分:11)
输入字符串,完成后按 Ctrl + Z (后跟 Enter ),如果在Windows或 Ctrl + D 。执行此操作时,cin>>temp;
循环中的for
条件将评估为false,程序将退出循环。
答案 1 :(得分:10)
首先,没有必要使用std_lib_facilities.h
。这只是本书中使用的内容,以避免书中的每个示例定期包含一组标准标题,或者纠正编译器之间的非标准行为。它也是using namespace std
的标题 - 你会发现很多例子(在SO和更广泛的互联网上)解释为什么在头文件中有using namespace std
是非常糟糕的做法。
其次,没有必要使用stdafx.h
。这是由Microsoft IDE生成的,它提供了一种加速大型项目编译的方法,因为它使编译器如何使用预编译的头文件。如果您只希望使用Microsoft编译器,那么请随意填充您的靴子并使用此编译器。但是,它不是标准的C ++,可能(取决于IDE和项目设置)包含不适用于非Microsoft编译器的特定于Windows的标题,并且在论坛中可能会阻止使用其他编译器的人帮助您 - 因为他们将拥有有充分的理由假设您的代码使用特定于Microsoft的扩展,这意味着他们可能无法帮助您。
第一个代码示例可以用标准C ++(不使用上面任何一个标题)重写为
#include <vector> // for std::vector
#include <string> // for std::string
#include <iostream> // std::cout and other I/O facilities
int main()
{
std::vector<std::string> words;
for(std::string temp; std::cin >> temp; )
words.push_back(temp);
std::cout << "Number of words: " << words.size() << '\n';
}
在你兴奋之前,这会出现同样的问题(显然没有完成)。原因实际上是循环的终止条件 - std::cin >> temp
只会在文件结束或流中遇到其他错误时终止循环。
所以,如果你输入
The cow jumped over the moon
std::cin
将继续等待输入。 USER通常需要触发和结束文件条件。在Windows下,这需要用户在空行上输入CTRL-Z
,然后输入回车键。
另一种方法是让一些预先商定的文本导致循环退出,例如
#include <vector> // for std::vector
#include <string> // for std::string
#include <iostream> // std::cout and other I/O facilities
int main()
{
std::vector<std::string> words;
for(std::string temp; std::cin >> temp && temp != "zzz"; )
words.push_back(temp);
std::cout << "Number of words: " << words.size() << '\n';
}
当输入包含单词zzz
时,将导致程序退出。例如
The cow jumped over the moon zzz
还有其他技术,例如一次读取一个字符,以及在用户输入两个连续换行符时停止。这需要您的代码解释每个字符,并决定什么构成一个单词。我会把它留作练习。
请注意,标准C ++中无法直接读取击键 - 上述问题与标准流的工作方式以及与主机系统的交互有关。
用户也可以通过将相同的文本放入实际文件中“按原样”使用程序,并且(当程序运行时)程序的重定向输入来自该文件。例如your_executable < filename
。