【问题标题】:C++ Program is not entering "for" loopC++ 程序未进入“for”循环
【发布时间】:2021-12-12 05:50:29
【问题描述】:

我正在制作一个程序来查找一行包含多少字谜来完成家庭作业,但我遇到了一个问题。我的程序没有进入一个简单的“for”循环。我整个晚上都在阅读,我不明白问题出在哪里。我已经放置了 7 个控制 cout-s 来查看它究竟在哪里进入和在哪里不进入。结果是 - 1, 2, 3 ,7 - 甚至没有进入“for”循环。可能是什么问题呢?这是我的代码:

#include<iostream>
#include<string>
#include <sstream>
#include<vector>
#include <algorithm>
using namespace std;
bool isAnagram(string x, string y)
{
    vector<char>v;
    int szX = x.size(), szY = y.size();
    for (int i = 0; i < szX; i++)
    {
        if (!(find(v.begin(), v.end(), x[i]) != v.end()))
        {
            v.push_back(x[i]);
        }
    }
    for (int j = 0; j < szY; j++)
    {
        if (!(find(v.begin(), v.end(), y[j]) != v.end()))
        {
            return false;
        }
    }
    return true;
}

void breakStringToWords(string str, vector<string> w)
{
    istringstream ss(str);
    string word;
    while (ss >> word)
    {
        w.push_back(word);
    } 
}

int main()
{ 
    string x;
    vector<string>v;
    int cnt=0,sz;
    while(getline(cin, x))
    {
        if(x=="")
        {
            return 0;
        }
        cout<<1<<endl;
        breakStringToWords(x, v);
        cout<<2<<endl;
        sz=v.size();
        cout<<3<<endl;
        for(int i=0; i<sz; i++)
        {
            cout<<4<<endl;
            if (isAnagram(v[i - 1], v[i]))
            {
                cout<<5<<endl;
                cnt++;
            }
            cout<<6<<endl;
        }
        cout<<7<<endl;
        cout<<cnt<<endl;
    }
    return 0;
}

提前谢谢你!

【问题讨论】:

  • 在'cout
  • void breakStringToWords(string str, vector&lt;string&gt; w) -- 您正在通过值传递w,这意味着它是临时的。当该函数返回时,您在w 上所做的所有工作都会化为乌有。 C++ 不是 Java 或任何其他使用引用语义的语言。
  • 当前行输入的字数:)
  • if 不好,因为 i 以 0 开头 ``` if (isAnagram(v[i - 1], v[i]))``` 这会导致 v[i - 1]越界。

标签: c++ loops for-loop enter


【解决方案1】:

这里有一个错误:

void breakStringToWords(string str, vector&lt;string&gt; w)

您通过值传递w,这意味着breakStringToWords 函数正在使用临时向量。一旦该函数返回,w 就不再存在。

您应该通过引用而不是值传递: void breakStringToWords(string str, vector&lt;string&gt;&amp; w) // Note the &amp;

这与做这样的事情没有什么不同:

#include <iostream>
void foo(int x)
{
  x = 10;
}

int main()
{
  int x = 0;
  foo(x);
  std::cout << x; // x is still 0, not 10
}

同样的问题,同样的解决方案——通过引用传递。

【讨论】:

  • 非常感谢!它进入循环并抛出另一个异常:) 继续调试!
【解决方案2】:

回复:

进入循环并抛出另一个异常

当 i 为 0 时,你正在访问v[-1]

    for(int i=0; i<sz; i++)
    {
        cout<<4<<endl;
        if (isAnagram(v[i - 1], v[i]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多