0

我需要编写一个程序,输入一个单词数组,每个单词不超过 50 个字符。(我只能使用<iostream>and <string.h>

示例输入是:watch stumble student point 欢迎

我的代码:

char input[1000000];
for (int i = 0, i < 1000000, i++) {
    cin >> input[i];
}

现在如何识别每个单词(每个单词最多 50 个字母)并将其存储在单独的字符串中,以便:

str1 = 'watch'
str2 = 'stumble'

等等。

然后我必须找到所有以用户输入的前缀开头的单词,例如,如果前缀是“stu”,则输出是:stumble student

如果有人能在接下来的 1-2 小时内提供帮助,我将不胜感激!

4

2 回答 2

2

对于初学者,请读入 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是一种将输入流视为容器的方法。

所以这给了你两个选择:

自己编写原始循环:whilefor. 大多数人都是这样写的,尤其是“初学者”,但我通常更喜欢使用内置功能来避免低级的东西。根据您所应用的概念来思考,即“我正在将这些词复制到屏幕上,如果它们以“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] << ' ';
        }
    }
}
于 2013-12-06T07:49:05.423 回答
0

您可以使用vector<string>来存储输入。然后,std::string::find()用于查找匹配项。

于 2013-12-06T07:38:00.137 回答