对于初学者,请读入 a std::string
,因此您无需担心长度。你这样做是循环条件,所以你阅读并立即检查它是否成功:
std::string word;
while (std::cin >> word) // ...
这将读取由空格分隔的字符串(空格、制表符、换行符等)。然后我会将它们存储到 astd::vector
中,因此您不必担心有多少单词:
std::vector<std::string> words;
std::string word;
while (std::cin >> word)
words.push_back(word);
然后循环并打印以 开头的单词"stu"
,您有多种选择。我将建议使用标准库算法copy_if
。这需要一个谓词(检查器函数),并将其应用于vector
. 如果谓词返回true
,它会将元素复制到其他地方,在这种情况下(这是唯一有点繁琐的位),我们复制到std::cout
,使用一种称为 an 的特殊迭代器ostream_iterator
:
std::copy_if(std::begin(words),
std::end (words),
std::ostream_iterator<std::string>(std::cout, " "),
[](const std::string& word){ return word.find("stu") == 0; });
这使用了一些C++11
特性(copy_if
、 lambdas 、非成员begin
/ end
)。您也可以自己编写裸循环(最好不要):
for (std::vector<std::string>::const_iterator it = words.begin();
it != words.end();
++it)
{
if (it->find("stu") == 0)
std::cout << *it << ' ';
}
您也可以使用类似的技术来读取输入,但我在上面展示了更常见的方式(根据我的经验)。有些人会认为这是可取的,但它使用了更多奇怪的迭代器:
std::vector<std::string> words;
std::copy(std::istream_iterator<std::string>(std::cin),
std::istream_iterator<std::string>(),
std::back_inserter(words));
istream_iterator
是一种将输入流视为容器的方法。
所以这给了你两个选择:
自己编写原始循环:while
和for
. 大多数人都是这样写的,尤其是“初学者”,但我通常更喜欢使用内置功能来避免低级的东西。根据您所应用的概念来思考,即“我正在将这些词复制到屏幕上,如果它们以“stu”开头的话”。
另一种选择是使用<algorithm>
标题中提供的设施。我喜欢这个选项,但它确实涉及到一些奇怪的迭代器。
编辑:顺便说一句,您需要的标题是<algorithm>
、<iostream>
、<iterator>
和. (如果您编写原始循环,则可以删除)。<string>
<vector>
<algorithm>
<iterator>
再次编辑:好的,我讨厌自己写这个,但这是一种只使用C
-style 字符串的方法。在使用这样的裸数组和指针时,您必须非常小心。我已经注释了代码以解释每个步骤。我不想只给出这样的完整解决方案,但我不确定如何最好地解释每个部分。请向它学习,而不是仅仅窃取它。
#include <cstring>
#include <iostream>
typedef char FixedLengthString [51]; // 50 chars plus NUL-terminator
int main()
{
FixedLengthString words [10]; // assume you never have more than 10
// if you have no limit, this is harder
// need to do two things at once in the loop:
// - read no more than ten
// - read and check it succeeded
int read = 0; // outside the loop, as we need it later
for (; read < 10; ++read)
{
std::cin.width(50); // saves us from overflowing by reading too much
std::cin >> words[read];
// die if the read failed (end of input or something broke)
if (!std::cin) break;
}
// loop over however many we successfully read
for (int i = 0; i < read; ++i)
{
// compare the first 3 characters of the words with "stu"
if (std::strncmp("stu", words[i], 3)==0)
{
std::cout << words[i] << ' ';
}
}
}