【问题标题】:std::cout not working inside a for-loopstd::cout 在 for 循环中不起作用
【发布时间】:2011-06-23 08:21:59
【问题描述】:

我是 C++ 新手,现在我正在从名为 Accelerated 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 有什么问题?

【问题讨论】:

  • 我建议你在调试器中运行你的应用程序,一步一步地观察变量的值来找出问题所在。如果向量中只有一个单词,则外部 for 循环将不会执行
  • 它是如何“不工作”的?
  • @Marius:+1 考虑极端情况总是一个很好的调试提示。
  • @ybungalobill 它没有给我任何输出。
  • FWIW,用英语命名变量是一件好事,即使你不是一个以英语为母语的人(比如我自己)。它对每个人都有帮助,而且您调用的所有 API/库都是英文的……(或者您是否将 std::vector 别名为 pl_std::vectory?;-P)

标签: c++ for-loop cout


【解决方案1】:

添加&lt;&lt; flush 以刷新输出缓冲区(每个位置)。

或者使用&lt;&lt; endl,它同时添加换行符和刷新。

代码存在问题,尤其是对于空输入,但这是您要学习的内容,所以我会留给您处理! :-)

干杯,

【讨论】:

    【解决方案2】:

    恐怕该语言在变量名称方面难以理解,但这个“Works for Me™”。

    这是我的输出(前 3 行输入:)

    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)  
    

    如果您只给出 1 个输入词,则此循环将不会运行,就像您在循环之前执行 duz_recenice = recenica.size(); 一样。

    将此行改为

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

    解决了这个问题。

    【讨论】:

    • 由于某种原因它现在也适用于我,我做了冲洗。你想对这个循环说什么?我必须确定字数,你写的for循环行就在它下面。
    • 代码中的外循环遍历 size-1 的条目,因此它错过了向量中的最后一个单词。请注意,我的输出显示了前两个单词的计数,但没有显示最后一个单词。
    • 哦,我明白你的意思了,但我仍然无法让这个程序正确计算我的话。例如,对于句子“我喜欢面包面包喜欢我”,最后它计数“我”两次,一次给我数字 2,第二次给我数字 1。这应该由 recenica.erase 解决行。
    猜你喜欢
    • 2011-01-03
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2013-12-31
    • 2017-01-14
    • 2011-07-21
    相关资源
    最近更新 更多