getche函数中的运行时错误

moh*_*ndy 0 c printf runtime-error runtime char

我正在尝试获取数组中某些字符的位置.我在下面使用此代码,但在我输入两个字符后,我遇到了运行时错误.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()

{   
  char board [8][8]={{0}};

  char kr,kc,qr,qc,nr,nc;
  unsigned char i,j;


  for (i = 0; i < 8 ;i++)
  {
    for (j = 'A'; j <= 'H'; j++)
    {
      board[i][j] = getche();
    }
  }

  for (i = 0; i < 8 ;i++)
  {
    for (j = 0; j < 9; j++)
    {
      if (board[i][j] == 'K')
      {
        kr = i;
        kc = j;
      }
      else if (board[i][j] == 'Q')
      {
        qr = i;
        qc = j;
      }
      else if (board[i][j] == 'N')
      {
        nr = i;
        nc = j;
      }
    }
  }
  printf("Q = %i %c    K = %i %c   N = %i %c",qr,qc,kr,kc,nr,nc);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我改变的类型i和j到unsigned int,程序运行,但打印错误的价值观和后刊出运行时错误.

Mik*_*CAT 6

在典型的环境中,'A'远远超过7(例如,ASCII代码为65),访问board[i]['A']将导致超出范围的访问,从而调用未定义的行为.不要访问(不读或写)超出范围.你也不能访问board[i][8].双方的for使用循环j的循环变量是错误的.

试试这个:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main(void) /* use one of standard signatures */
{
    char board [8][8]={{0}};

    char kr=0,kc=0,qr=0,qc=0,nr=0,nc=0; /* initialize to avoid using indeterminate values */
    unsigned char i,j;


    for (i = 0; i < 8 ;i++)
    {
        for (j = 0; j < 8; j++) /* correct range */
            {
                board[i][j] = getche();
            }
    }

    for (i = 0; i < 8 ;i++)
    {
        for (j = 0; j < 8; j++) /* correct range */
        {
            if (board[i][j] == 'K')
            {
                kr = i;
                kc = j;
            }
            else if (board[i][j] == 'Q')
            {
                qr = i;
                qc = j;
            }
            else if (board[i][j] == 'N')
            {
                nr = i;
                nc = j;
            }
        }
    }
    printf("Q = %i %c    K = %i %c   N = %i %c",qr,qc,kr,kc,nr,nc);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,范围0到7中的值不是ASCII代码中的可打印字符,因此最后一个printf()可能会产生您不想要的内容.