为什么我的 while 循环没有采用此特定示例用户输入中的最后一个值?
Why is the last value in this specific example user input not being taken for my while loop?
我遇到一个错误,在从 while
循环接收用户输入后,我的代码不接受最后一个值。这个错误发生在一个具体的例子上,我不知道为什么会这样。
因此,例如,用户输入:
7
3 1 4 0 0 2 0
输出为:
3140020
HOWEVER,用户输入如下(这是具体示例):
7
3 0 1 0 0 2 0
输出应该是:
3010020
BUT,输出为:
301002
我完全想不通。代码附在下面:
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
// Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(NULL), right(NULL) {}
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* construct_tree(){
int n;
cin >> n;
int curr_inp;
vector<TreeNode*> vec;
for (int i = 0; i < n; i++) {
cin >> curr_inp;
cout << curr_inp; // **this is the place of bug**
if (curr_inp != 0)
vec.push_back(new TreeNode(curr_inp));
else
vec.push_back(NULL);
}
for(int i = 0; i< floor(n/2);i++ )
{
vec[i]->left = vec[2*i+1];
vec[i]->right = vec[2*i+2];
}
cout << '\n';
return vec[0];
}
int main() {
TreeNode* root = construct_tree();
return 0;
}
您的 construct_tree()
函数在其第二个 for
循环中崩溃。这阻止了写入 cout
的最后一个字符的输出,因为 cout
输出默认情况下是缓冲的,并且最后一个字符仍在缓冲区中并且尚未刷新到控制台时发生崩溃。
cin
和 cout
默认情况下 tie()
在一起,因此从 cin
读取输入将首先隐式刷新 cout
,但是有在第一个 for
循环的最后一次迭代写入 cout
.
之后,没有从 cin
读取数据
在第一个 for
循环完成后,在进入第二个 for
循环之前,尝试添加对 cout << flush
或 cout.flush()
的调用。或者在第一个 for
循环中使用 cout << curr_inp << flush;
。然后你会看到显示的最后一个字符。
然后,您需要修复崩溃。
问题不在cout << curr_inp;
问题在你使用的循环
for(int i = 0; i< floor(n/2);i++ )
{
vec[i]->left = vec[2*i+1];
vec[i]->right = vec[2*i+2];
}
您正在尝试使用空向量
调用 left
和 right
添加空检查后没有分段错误
for(int i = 0; i< floor(n/2);i++ )
{
if (vec[i]) {
vec[i]->left = vec[2*i+1];
vec[i]->right = vec[2*i+2];
} else {
cout << "nullptr \n";
}
}
现在当我使用
7
3 0 1 0 0 2 0
我得到了以下输出
7
3 0 1 0 0 2 0
3010020nullptr
结论:我不知道你的逻辑是什么,但问题是因为取消引用nullptr
我遇到一个错误,在从 while
循环接收用户输入后,我的代码不接受最后一个值。这个错误发生在一个具体的例子上,我不知道为什么会这样。
因此,例如,用户输入:
7
3 1 4 0 0 2 0
输出为:
3140020
HOWEVER,用户输入如下(这是具体示例):
7
3 0 1 0 0 2 0
输出应该是:
3010020
BUT,输出为:
301002
我完全想不通。代码附在下面:
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
// Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(NULL), right(NULL) {}
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* construct_tree(){
int n;
cin >> n;
int curr_inp;
vector<TreeNode*> vec;
for (int i = 0; i < n; i++) {
cin >> curr_inp;
cout << curr_inp; // **this is the place of bug**
if (curr_inp != 0)
vec.push_back(new TreeNode(curr_inp));
else
vec.push_back(NULL);
}
for(int i = 0; i< floor(n/2);i++ )
{
vec[i]->left = vec[2*i+1];
vec[i]->right = vec[2*i+2];
}
cout << '\n';
return vec[0];
}
int main() {
TreeNode* root = construct_tree();
return 0;
}
您的 construct_tree()
函数在其第二个 for
循环中崩溃。这阻止了写入 cout
的最后一个字符的输出,因为 cout
输出默认情况下是缓冲的,并且最后一个字符仍在缓冲区中并且尚未刷新到控制台时发生崩溃。
cin
和 cout
默认情况下 tie()
在一起,因此从 cin
读取输入将首先隐式刷新 cout
,但是有在第一个 for
循环的最后一次迭代写入 cout
.
cin
读取数据
在第一个 for
循环完成后,在进入第二个 for
循环之前,尝试添加对 cout << flush
或 cout.flush()
的调用。或者在第一个 for
循环中使用 cout << curr_inp << flush;
。然后你会看到显示的最后一个字符。
然后,您需要修复崩溃。
问题不在cout << curr_inp;
问题在你使用的循环
for(int i = 0; i< floor(n/2);i++ )
{
vec[i]->left = vec[2*i+1];
vec[i]->right = vec[2*i+2];
}
您正在尝试使用空向量
调用left
和 right
添加空检查后没有分段错误
for(int i = 0; i< floor(n/2);i++ )
{
if (vec[i]) {
vec[i]->left = vec[2*i+1];
vec[i]->right = vec[2*i+2];
} else {
cout << "nullptr \n";
}
}
现在当我使用
7
3 0 1 0 0 2 0
我得到了以下输出
7
3 0 1 0 0 2 0
3010020nullptr
结论:我不知道你的逻辑是什么,但问题是因为取消引用nullptr