【发布时间】:2021-12-30 20:18:51
【问题描述】:
#include <iostream>
#include <vector>
using namespace std;
typedef vector<string> VS;
void back(VS ¶ules, VS &sol, int n, int i) {
if(i == n) {
cout << "{" << sol[0];
for(int j = 1; j < n; j++) {
cout << "," << sol[i];
}
cout << "}" << endl;
}
else {
for(int j = 0; j < n; j++) {
sol[i] = paraules[j];
back(paraules, sol, n, i+1);
}
}
}
int main() {
int n;
cin >> n;
VS sol(n);
VS paraules(n);
for(int i = 0; i < n; i++) {
cin >> paraules[i];
}
cout << "This won t print";
back(paraules, sol, n, 0);
}
现在粘贴整个代码。采用n 单词的回溯,只打印单词的所有排列。
我最初认为这是阅读问题,因为 this wont print 没有打印。经过一些测试,我发现在最后一行注释函数调用会使错误消失,并且代码不再崩溃。
所以这可能是功能?这仍然不能解释为什么它不打印,因为调用发生在 cout 之后。
例如输入可能是:
2 再见
【问题讨论】:
-
也许它确实到达
func,输入func并在程序可以发出您期望的任何输出之前在func内的某个地方崩溃,或者可能在输出发出之后但在终端绘制之前它在屏幕上.. -
minimal reproducible example (MRE) 的真正美妙之处在于,如果不隔离错误并减少其周围的噪音以使问题变得明显,就很难制作出好的 MRE。发现的错误通常是死错误,因此不再需要提问。尽早完成 MRE,您通常会提前完成。如果不是您有误解,我们往往会很快解决这些问题,或者问题是一个需要领域专家的棘手问题。
-
this still doesn t explain why it s not printing, since the call happens after the cout你传递给cout的内容是缓冲的,因此如果应用程序在缓冲区刷新之前崩溃,则不会显示任何内容。控制台输出肯定有助于调试,但您应该始终将其与调试器结合使用,以便查看代码的哪些部分实际执行。 -
对于输入“2 hi bye”,这个:
for(int j = 1; j < n; j++) { cout << "," << sol[i];-- 越界。将[]更改为at(),您将看到问题。for(int j = 1; j < n; j++) {cout << "," << sol.at(i);。当您使用at()时,如果超出向量范围,将引发std::out_of_range异常。