getche函数中的运行时错误

时间:2016-06-16 15:01:39

标签: c char printf runtime runtime-error

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

#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;
}

当我将ij的类型更改为unsigned int时,程序会运行但会输出错误的值,并且在打印后会出现运行时错误。

3 个答案:

答案 0 :(得分: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]=vim.desktop;

    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;
}

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

答案 1 :(得分:1)

OP显然希望使用'A', 'B', ... 'H'作为0,1,...7来索引数组board[][]。但是'A'有一个值,它不是0,但通常是65 - 字符A的ASCII值。

char board [8][8]=Regular expression visualization;
...
for (i = 0; i < 8 ;i++) {
  for (j = 'A'; j <= 'H'; j++) {
    //       v--------------- problem
    board[i][j] = getche();
  }
}

各种解决方案

合理地移植到基于ASCII的编译器

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

C11便携式使用复合文字 - 不是那么实用,而是为了好玩。

  for (j = 'A'; j <= 'H'; j++) {
    board[i][strtol((char [2]){j, '\0'}, NULL, 18)] = getche();
  }

或简单地使用0到7

  for (j = 0; j < 8; j++) {
    board[i][j] = getche();
  }
OP确实有第二个问题

  char board [8][8]={{0}};
  ...
  for (i = 0; i < 8 ;i++) {    
    //                 9?!
    // for (j = 0; j < 9; j++)
    for (j = 0; j < 8; j++)

答案 2 :(得分:0)

for (j = 'A'; j <= 'H'; j++) 

我不知道这条线应该做什么,但是在角色A初始化然后开始从该位置初始化阵列对我来说似乎并不合适。