为什么打印“确定”会更改输出?

时间:2020-05-12 14:36:15

标签: 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" << 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;
}

我运行此程序以跟踪输入

abcabcxy
ax
2 2
2 6
6 7

在此代码中,如果我多次(5-7次)运行相同的代码,则会显示不同的输出。 有时“ OK YES NO”。有时“ OK YES YES”。 但是如果我评论“ cout <<“ OK” << endl;“这行总是显示“ YES YES” 谁能说我为什么会这样? 如何摆脱呢?

1 个答案:

答案 0 :(得分:2)

有一些超出范围错误的情况。我删除了C字符串,C数组和非标准功能,并添加了一些绑定检查并移动了一个绑定检查。现在您的代码输出了NO 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;
}