c - getche 函数中的运行时错误

标签 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 时,程序运行但打印错误值,打印后进入运行时错误。

最佳答案

在典型环境下,'A'远大于7(例如ASCII码为65),访问board[i]['A '] 将导致超出范围的访问,从而调用未定义的行为。不要访问(不读也不写)超出范围。 您也不能访问 board[i][8]。使用j作为循环变量的for循环都是错误的。

试试这个:

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

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

关于c - getche 函数中的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37862836/

相关文章:

c - 在 do-while 语句中添加整数

c++ - 当我用 libgcc 替换 libstdc++ 时,为什么我的 C++ 程序可以正确链接

c# - 如何将字符串 "brakemeup"转换为 char[stringlength] 数组?

C - 执行命令的函数

java - 将字符数组中的小写字符转换为大写字符(java)

c++ - 尝试替换字符串中的字符时发生内存泄漏

c++ - C++ 中带有换行符的 printf 的奇怪行为

c - C中单引号和双引号的区别

c - 如何使用 printf 函数添加连续字节的数字以显示整数?

c - dnotify 在内核 4.x 中是否已过时?