我试图获取数组中某些字符的位置。我在下面使用此代码,但在输入两个字符后,我遇到了运行时错误。
#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;
}
当我将i
和j
的类型更改为unsigned int
时,程序会运行但会输出错误的值,并且在打印后会出现运行时错误。
答案 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]=;
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]=;
...
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初始化然后开始从该位置初始化阵列对我来说似乎并不合适。