Problem p03574 (C++)

Buggy submission (status: Runtime Error):
// https://atcoder.jp/contests/abc075/tasks/abc075_b

#include <iostream>
using namespace std;

int main(void) {
  int H, W;
  int counter = 0;
  // string S[51][51];
  string S[50];

  cin >> H >> W;
  for (int i = 0; i < H; i++) {
    cin >> S[i];
  }
  // for (int i = 0; i < H; i++){
  //         cout << S[i] << endl;
  // }

  // string num[H][W];
  int num[H][W];
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      num[H][W] = 0;
    }
  }
  int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
  int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};
  int ii = 0;
  int jj = 0;

  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      counter = 0;
      // if (S[i][j] == '.') printf("S[%d][%d]=clear\r\n",i,j);
      if (S[i][j] == '.') {
        for (int p = i - 1; p <= i + 1; p++) {
          for (int q = j - 1; q <= j + 1; q++) {
            if (p >= 0 && q >= 0 && p < H && q < W && S[p][q] == '#')
              counter++;
          }
        }

        S[i][j] = '0' + counter;
        // printf("num[%d][%d] = %d\r\n",i,j,num[i][j]);

        // for (int k = 0; k < 8; k++){
        //     ii = i + dx[k];
        //     jj = j + dy[k];
        //     if(ii >= 0 && jj >= 0 && ii < H && jj < W && S[ii][jj] == '#')
        //     counter ++;
        // }
        // S[i][j] = '0' + counter;
      }
    }
  }
  // for (int i = 0; i < H; i++){
  //     for (int j = 0; j < W; j++){
  //         if (S[i][j] == '.'){
  //             S[i][j] = char('0' + num[i][j]);
  //         }
  //     }
  // }
  for (int i = 0; i < H; i++) {
    cout << S[i] << endl;
  }

  return 0;
}

Fixed submission:
// https://atcoder.jp/contests/abc075/tasks/abc075_b

#include <iostream>
using namespace std;

int main(void) {
  int H, W;
  int counter = 0;
  // string S[51][51];
  string S[50];

  cin >> H >> W;
  for (int i = 0; i < H; i++) {
    cin >> S[i];
  }
  // for (int i = 0; i < H; i++){
  //         cout << S[i] << endl;
  // }

  // string num[H][W];
  // int num[H][W];
  // for (int i = 0; i < H; i++){
  //     for (int j = 0; j < W; j++){
  //         num[H][W] = 0;
  //     }
  // }
  int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
  int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};
  int ii = 0;
  int jj = 0;

  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      counter = 0;
      // if (S[i][j] == '.') printf("S[%d][%d]=clear\r\n",i,j);
      if (S[i][j] == '.') {
        for (int p = i - 1; p <= i + 1; p++) {
          for (int q = j - 1; q <= j + 1; q++) {
            if (p >= 0 && q >= 0 && p < H && q < W && S[p][q] == '#')
              counter++;
          }
        }

        S[i][j] = '0' + counter;
        // printf("num[%d][%d] = %d\r\n",i,j,num[i][j]);

        // for (int k = 0; k < 8; k++){
        //     ii = i + dx[k];
        //     jj = j + dy[k];
        //     if(ii >= 0 && jj >= 0 && ii < H && jj < W && S[ii][jj] == '#')
        //     counter ++;
        // }
        // S[i][j] = '0' + counter;
      }
    }
  }
  // for (int i = 0; i < H; i++){
  //     for (int j = 0; j < W; j++){
  //         if (S[i][j] == '.'){
  //             S[i][j] = char('0' + num[i][j]);
  //         }
  //     }
  // }
  for (int i = 0; i < H; i++) {
    cout << S[i] << endl;
  }

  return 0;
}