在for循环中std::cout无法工作

3
我是C++的新手,目前正在学习一本名为《加速C++》的书。我完成了第三章(向量),并接触到了这个练习题:
“编写一个程序来计算输入中每个不同单词出现的次数。”
经过一番思考,我开始着手解决这个问题。我想测试程序,但是std::cout没有起作用。我在我的代码中放置了cout << "test";,以查看问题所在,并得出结论:它不起作用于第一个for循环内部。不要建议我使用映射来解决问题,因为我正在使用向量。变量不是英文的,所以我会为您翻译一些内容,以便您知道发生了什么:
recenica - 句子;rijec - 一个单词;vel_vektora - 向量的大小;duz_recenice - 句子的长度;br_ponavljanja - 单词在句子中出现的次数;
#include <vector>
#include <iostream>
#include <string>

using std::string;      using std::vector;
using std::cin;         using std::cout;
using std::endl;



int main()
{
    string rijec;
    vector<string> recenica;

    while (cin >> rijec) recenica.push_back(rijec);
    cout << endl;

    typedef vector<string>::size_type vel_vektora;
    vel_vektora duz_recenice = recenica.size();
    cout << "test0, ";

    for (int i = 0; i < duz_recenice - 1; ++i)            
    {   
        cout << "test, !";
        int br_ponavljanja = 1;

        for (int j = i + 1; j < duz_recenice; ++j)
        {
                cout << "test2, ";
                if (recenica[i] == recenica[j])
                {
                                cout << "test3, ";
                                ++br_ponavljanja;
                                recenica.erase(recenica.begin() + j);
                }     
                cout << "test4, ";
        }        
        cout << recenica[i] << ": " << br_ponavljanja << endl;        
    }
    cout << "test5, ";                
    getchar();
    return 0;        
}

“std::cout”有什么问题?

6
建议你在调试器中逐步运行应用程序,观察变量的值,以找出问题所在。如果向量中只有一个单词,则外部for循环将不会执行。 - Marius Bancila
1
它为什么“不工作”? - Yakov Galka
@Marius:+1 思考边角情况总是一个很好的调试提示。 - fredoverflow
@ybungalobill 它没有给我任何输出。 - Bane Bojanić
5
就此而言,即使你不是以英语为母语的人(就像我自己一样),在编程中使用英语作为变量名称是有益的。这可以帮助每个人,并且您调用的所有API /库都是英文的... (或者您把std::vector别名为pl_std::vectory吗?;-P) - Macke
我成功解决了问题,这里有“已解决”的按钮吗? - Bane Bojanić
2个回答

7

添加<< flush以清空输出缓冲区(每个位置)。

或者使用<< endl,它既添加换行符又刷新缓冲区。

代码存在问题,特别是对于空输入的情况,但这正是您需要了解的内容,所以我会留给您自己解决!:-)

祝好运。


1

对于变量名称,我有些不太清楚,但这个“Works for Me™”。

以下是我的输出(前三行输入:)

ytreyert
tyryteter
gdhdfgdf
^Z

test0, test, !test2, test4, test2, test4, ytreyert: 1
test, !test2, test4, tyryteter: 1
test5,

在打印后,您应该尝试清除cout缓冲区(根据Alf的回答)。

我注意到gdhdfgdf没有被计算,这是因为这行代码:

for (int i = 0; i < duz_recenice - 1; ++i)  

如果您只提供一个输入单词,此循环将不会运行,因为在循环之前执行了duz_recenice = recenica.size();
将此行更改为:
for (int i = 0; i < duz_recenice; ++i)  

解决了这个问题。


现在它对我也起作用了,我进行了刷新。你想通过这个关于循环说什么?我必须确定单词的数量,而你写的for循环代码就在下面。 - Bane Bojanić
你的代码中的外层循环迭代了大小为-1的项,因此错过了向量中的最后一个单词。请注意,我的输出显示了前两个单词的计数,但没有最后一个单词的计数。 - badgerr
哦,我明白你的观点,但我仍然无法使这个程序正确计算我的单词。例如,对于句子“我喜欢面包,面包也喜欢我”,最后它会将“我”计算两次,一次给出数字2,第二次给出数字1。这应该可以通过recenica.erase行来解决。 - Bane Bojanić

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接