我需要编写一个程序,输入一个单词数组,每个单词不超过50个字符。 (我只能使用<iostream>
和<string.h>
)
示例输入是: 观看绊倒学生点欢迎
我的代码:
char input[1000000];
for (int i = 0, i < 1000000, i++) {
cin >> input[i];
}
现在我如何识别每个单词(每个单词最多50个字母)并将其存储在单独的字符串中,以便:
str1 = 'watch'
str2 = 'stumble'
等等。
然后我必须找到所有以用户输入的前缀开头的单词,例如 如果前缀是“stu”,则输出为: 蹒跚学生
如果有人能在接下来的1-2小时内提供帮助,我将非常感激!
答案 0 :(得分:2)
对于初学者,请阅读std::string
,这样您就不必担心长度了。你这样做是循环条件,所以你阅读并立即检查它是否成功:
std::string word;
while (std::cin >> word) // ...
这将读取由空格(空格,制表符,换行符等)分隔的字符串。
然后我将它们存储到std::vector
中,这样您就不必担心有多少单词:
std::vector<std::string> words;
std::string word;
while (std::cin >> word)
words.push_back(word);
然后循环显示并打印以"stu"
开头的单词,您有多种选择。我将建议使用标准库算法copy_if
。这需要谓词(检查函数),并将其应用于vector
中的每个元素。如果谓词返回true
,它会将元素复制到其他地方,在这种情况下(这是唯一略微繁琐的位),我们使用一种称为an的特殊迭代器复制到std::cout
。 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>
和{{1} }。 (如果编写原始循环,可以删除<vector>
和<algorithm>
。
再次编辑:好的,我讨厌写这篇文章,但这是一种只使用<iterator>
样式字符串的方式。在使用像这样的裸数组和指针时,你必须非常小心。我已经评论了代码来解释每一步。我不想仅仅提供这样的完整解决方案,但我不确定如何最好地解释每个部分。请从中学习,而不仅仅是偷它。
C
答案 1 :(得分:0)
您可以使用vector<string>
存储输入。然后,使用std::string::find()
查找匹配的内容。