在没有c ++标准库类的情况下使用C ++进行用户输入

时间:2015-09-21 17:01:42

标签: c++

我正在尝试从控制台获取用户输入,而不使用c ++标准库类。这是我的代码

while(true){
        std::string line = " ";

        while (getline(std::cin, line)) {

            std::string arr[100];
            int i = 0, len = 0;
            for (int j=0; j < line.length(); j++) {
                if(line[j] ==' ' || line[j] == '\n'){
                    std::string word = line.substr(i, j);
                    arr[len] = word;
                    len++;
                    i = j;
                }
            }
            for (int k = 0; k <len ; ++k) {
                std::cout<<arr[k]<<std::endl;
            }

        }

        //break;
    }

这个想法是识别每个单词并将其存储在一个数组中。但是,该程序仅识别第一个单词。任何想法,我在这里做错了什么。

1 个答案:

答案 0 :(得分:1)

在阅读本文时,您的问题似乎就在std::string word = line.substr(i, j);行。你必须明白substr的论点不是“从i到j”,而是“从i,j字符”。 Read the documentation.:)

我没有测试过这个,所以它可能不完美,但原则就在那里。

while(true){
        std::string line = " ";

        while (getline(std::cin, line)) {

            std::string arr[100];
            int num_chars = 0, word = 0;
            for (int i=0; i < line.length(); i++) {
                /*We increment i, so every non-space character is one we
                 * will include in the word.*/
                num_chars++;
                if(line[i] ==' ' || line[i] == '\n'){
                    /*We want all characters from i to i+num_chars, that is
                     * we want all characters from j, forward i indices.
                     */
                    std::string word = line.substr(i, num_chars);
                    arr[word] = word;
                    word++;
                    //We reset i here, in prep for parsing the next word.
                    i = 0;
                }
            }
            for (int k = 0; k <len ; ++k) {
                std::cout<<arr[k]<<std::endl;
            }

        }

        //break;
    }

另外两个考虑因素:

1)注意单字母变量,因为它使得以后阅读代码变得更加困难。 i是循环 i terator或 i ndex的标准,当您为循环嵌套时j是下一个 < / em>的。但是,i不适合“单词的长度”。同样,len不适合存储的单词的索引。我更改了代码中的变量,使其更易于阅读。

2)我会认真考虑重新审视你的循环结构。 while是常见且非常有用的,但它也非常容易出现无限循环。事实上,while(true)是一个无限循环,所以如果你因为某种原因没有达到break,你就会遇到一些严重的问题。

-

我也同意,如果你想避免“STL”(实际上std::stl通常会混淆,但不是一回事...所以让我们说你想要要避免std),您需要避免std::stringstd::cin。正如Nidhoegger建议的那样,使用C字符串和scanf / printf代替。它比std选项更有效,但它更容易出现C的错误和“未定义行为”特征。这需要更多的努力,但如果你做得对,会产生更有效的结果。 / p>

虽然我们正在使用它,但我不建议使用std::stringstream,除非您的其他工具无法正常工作。该课程存在严重的性能和效率问题,这些问题已得到充分证明。我只建议在使用std::string编写自己的代码的情况下使用它,这样做太费力或者很有可能效率低下。这不是其中之一。