分段错误(核心转储)[已关闭]

问题描述 投票:0回答:1

在第 40 行,我的代码停止运行并输出信号:分段错误(核心转储),我很困惑为什么我的代码出现分段错误,因为我没有访问任何越界索引,也没有修改字符串文字。一般来说,如果值 (k + i) 大于 N,我想向后迭代,直到出现一个点“.”。在数组(补丁)中放置补丁“H”或“G”。

这是我正在接受的输入: 1 5 4 GHHG

这是我写的代码:

#include <iostream>
#include <vector>
#include <array>
using namespace std;
int main() {
string cows;
int CONST_N = 100000;
array<string, 100000> patches;
int t, n, k, patchCounter{}; cin >> t;
  while(t--){ 
    patchCounter = 0;
    cin >> n; cin >> k;
    cin >> cows;
  //  cout << n << endl;
    for(int i = 0 ;i < CONST_N;i++){
  patches[i] = "N";
}
    for(int i = 0 ;i < n ;i++){
      patches[i] = ".";
    }
    for(int i = 0; i < n ;i++){
      if(cows.substr(i, 1) == "G"){
        if(patches[k + i] == "N"){
          for(int j = n - 1; j >=0;j++){
            if(patches[j] == "."){
              patches[j] = "G";
              break;
            }
        }
          } else {
          patches[k+i] = "G"; i+=(2*k); patchCounter++; 
          }
        }
      }
    for(int i = 0; i < n ;i++){
      if(cows.substr(i,1) == "H"){
         // cout<<(patches[k +i]  == "N") << endl;
        //cout << patches[k +i] << endl;
         if(patches[k + i] == "N"){
           cout << "hello";
          for(int j = n - 1; j >=0;j++){
            if(patches[j] == "."){
              patches[j] = "H";
              break;
            }
        }
          } else {
          patches[k+i] = "H"; i+=(2*k); patchCounter++; 
          }
        }
      }
    cout << patchCounter << endl;
    for(int i = 0 ;i < n ;i++){
      cout << patches[i];
    }
    cout << endl;
 
    }
  return 0;
}

我不确定该怎么做,因为数组大小是 10^5 并且我只访问索引 6 所以我很困惑发生了什么。我真的很感激一些帮助。谢谢!

c++ arrays string vector segmentation-fault
1个回答
1
投票

你的代码似乎有一个拼写错误,在这里

for (int j = n - 1; j >= 0; j++) {
    if (patches[j] == ".") {
        patches[j] = "H";
        break;
    }
}

应该是

for (int j = n - 1; j >= 0; j--) { // TYPO -- not ++
    if (patches[j] == ".") {
        patches[j] = "H";
        break;
    }
}

老实说,我用调试器花了 30 秒才发现这一点。

© www.soinside.com 2019 - 2024. All rights reserved.