C++ 为什么要印刷;“好的”;改变输出?
请看一下这个代码C++ 为什么要印刷;“好的”;改变输出?,c++,C++,请看一下这个代码 #include<iostream> #include <string.h> using namespace std; int main() { char ami[100000], tumi[100000]; scanf("%s ", ami); scanf("%s ", tumi); //************ This is the Problem*********** cout << "OK" <
#include<iostream>
#include <string.h>
using namespace std;
int main()
{
char ami[100000], tumi[100000];
scanf("%s ", ami);
scanf("%s ", tumi);
//************ This is the Problem***********
cout << "OK" << endl;
//*******************************************
int l1 = strlen(ami);
int l2 = strlen(tumi);
int fwd[l1+1];
int rev[l1+1];
int j = 0;
for(int i = 0; i < l1;i++)
{
if(j < l2 && ami[i] == tumi[j])
{
j++;
fwd[i]++;
}
if(i!=0)
fwd[i] += fwd[i-1];
}
j = l2- 1;
for(int i = l1-1; i>=0; i--)
{
if(j >= 0 && ami[i] == tumi[j] )
{
j--;
rev[i]++;
}
if(i!= l1-1)
rev[i]+=rev[i+1];
}
long long int Q, HUDAI;
scanf("%lld %lld", &Q, &HUDAI);
for(int i = 0; i < Q; i++)
{
long long int x, y;
scanf("%lld %lld", &x, &y);
if(fwd[x-1]+rev[y+1] >= l2) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
在这段代码中,如果我多次(5-7次)运行同一代码,它将显示不同的输出。。
有时是“好的,是的,不是”有时是“好的,是的”。。
但如果我对“cout进行注释,则会出现一些越界错误。我删除了C字符串、C数组和非标准功能,添加了一些绑定检查,并移动了一个绑定检查。现在,您的代码输出了
NO
,我没有发现任何未定义的行为:
#include <array>
#include <iostream>
#include <vector>
int main() {
std::string ami, tumi;
std::cin >> ami >> tumi;
//************ This is the Problem***********
std::cout << "OK\n";
//*******************************************
const int l1 = ami.length();
const int l2 = tumi.length();
std::vector<int> fwd(l1 + 1);
std::vector<int> rev(l1 + 1);
for (int i = 0, j = 0; i < l1; ++i) {
if (static_cast<std::size_t>(j) < tumi.length() &&
ami.at(i) == tumi.at(j) && j < l2) {
++j;
++fwd[i];
}
if (i != 0) fwd.at(i) += fwd.at(i - 1);
}
for (int i = l1 - 1, j = l2 - 1; i >= 0; --i) {
if (j >= 0 && ami.at(i) == tumi.at(j)) {
--j;
++rev.at(i);
}
if (i != l1 - 1) rev.at(i) += rev.at(i + 1);
}
long long int Q, HUDAI;
std::cin >> Q >> HUDAI;
for (int i = 0; i < Q; ++i) {
long long int x, y;
std::cin >> x >> y;
if (fwd.at(x - 1) + rev.at(y + 1) >= l2)
std::cout << "YES\n";
else
std::cout << "NO\n";
}
return 0;
}
#包括
#包括
#包括
int main(){
std::字符串ami,tumi;
标准::cin>>ami>>图米;
//************这就是问题所在***********
标准::cout=0;--i){
如果(j>=0&&ami.at(i)==tumi.at(j)){
--j;
++第(i)款修订;
}
如果(i!=l1-1)在(i)+=rev.at(i+1);
}
龙龙国际Q,胡岱;
标准::cin>>Q>>胡岱;
对于(int i=0;i>x>>y;
如果(在(x-1)处的前向+在(y+1)处的后向>=l2)
std::cout存在一些越界错误。我删除了C字符串、C数组和非标准功能,添加了一些绑定检查并移动了一个绑定检查。现在您的代码输出NO
,我没有发现任何未定义的行为:
#include <array>
#include <iostream>
#include <vector>
int main() {
std::string ami, tumi;
std::cin >> ami >> tumi;
//************ This is the Problem***********
std::cout << "OK\n";
//*******************************************
const int l1 = ami.length();
const int l2 = tumi.length();
std::vector<int> fwd(l1 + 1);
std::vector<int> rev(l1 + 1);
for (int i = 0, j = 0; i < l1; ++i) {
if (static_cast<std::size_t>(j) < tumi.length() &&
ami.at(i) == tumi.at(j) && j < l2) {
++j;
++fwd[i];
}
if (i != 0) fwd.at(i) += fwd.at(i - 1);
}
for (int i = l1 - 1, j = l2 - 1; i >= 0; --i) {
if (j >= 0 && ami.at(i) == tumi.at(j)) {
--j;
++rev.at(i);
}
if (i != l1 - 1) rev.at(i) += rev.at(i + 1);
}
long long int Q, HUDAI;
std::cin >> Q >> HUDAI;
for (int i = 0; i < Q; ++i) {
long long int x, y;
std::cin >> x >> y;
if (fwd.at(x - 1) + rev.at(y + 1) >= l2)
std::cout << "YES\n";
else
std::cout << "NO\n";
}
return 0;
}
#包括
#包括
#包括
int main(){
std::字符串ami,tumi;
标准::cin>>ami>>图米;
//************这就是问题所在***********
标准::cout=0;--i){
如果(j>=0&&ami.at(i)==tumi.at(j)){
--j;
++第(i)款修订;
}
如果(i!=l1-1)在(i)+=rev.at(i+1);
}
龙龙国际Q,胡岱;
标准::cin>>Q>>胡岱;
对于(int i=0;i>x>>y;
如果(在(x-1)处的前向+在(y+1)处的后向>=l2)
std::难道这意味着你的代码有未定义的行为吗?在某个地方你正在做一些非法的事情,很可能你正在超出数组的界限。使用你的调试器逐步检查代码并确保你所有的数组访问都是合法的。如果(ami[i]==tumi[j]&&j
。在编制索引之前进行检查。首先猜测int-fwd[l1]
->int-fwd[l1+1]
,您需要为NUL终端留出空间。完成此操作后(fwd[l1+1])仍然存在相同的问题。有更多越界访问,但您已将其隐藏。您使用char-ami[100000]和tumi[100000]创建了两个数组;
。您没有初始化它们。您读取了8和2个字符。但是您访问了未初始化的元素tumi[2]
:这意味着您的代码有未定义的行为。您在某个地方做了非法的事情,很可能是超出了数组的界限。请使用调试器逐步检查代码并确保所有数组访问都是合法的。如果(ami[i]==tumi[j]&&j
。在编制索引之前进行检查。首先猜测int-fwd[l1]
->int-fwd[l1+1]
,您需要为NUL终端留出空间。完成此操作后(fwd[l1+1])仍然存在相同的问题。有更多越界访问,但您已将其隐藏。您使用char-ami[100000]和tumi[100000]创建了两个数组;
。您没有初始化它们。您读取了8和2个字符。但是您访问了未初始化的元素tumi[2]
: