2016-06-16 6 views
0

Ich versuche, die Position einiger Zeichen im Array zu bekommen. Ich benutze diesen Code unten, aber nachdem ich nur zwei Zeichen eingegeben habe, habe ich Laufzeitfehler bekommen.Laufzeitfehler in getche Funktion

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

Wenn ich die Art von i und j-unsigned int, Programm läuft, aber druckt falsche Werte ändern und nach dem Druck geht Zeitfehler laufen.

Antwort

6

In typischer Umgebung 'A' ist weit mehr als 7 (65 im ASCII-Code, zum Beispiel) und board[i]['A'] Zugriff verursacht Zugriff out-of-Bereich, dasundefiniertes Verhalten aufruft. Zugriff (nicht lesen oder schreiben) nicht möglich. Sie dürfen auch nicht auf zugreifen. beide der for Schleife, die j als Loop-Variable verwenden, sind falsch.

Versuchen Sie folgendes:

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

Beachten Sie, dass Wert im Bereich von 0 bis 7 sind nicht druckbare Zeichen im ASCII-Code, so dass die letzte printf() könnte produzieren, was Sie nicht wollen.

+1

Gute Antwort 1, aber ich neugierig nach wie vor über das, was OP tun will mit 'für (j = 'A'; j <= 'H'; j ++)' – LPs

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

Ich weiß nicht, was diese Linie tun soll, sondern auf den Charakter A initialisiert und dann aus dieser Position das Array zu initialisieren Start nicht richtig zu mir zu sein scheinen.

+2

_ scheint nicht richtig zu mir _... es ist völlig falsch, weil 'A''' 65' ein wenig aus ist gebunden von 8 Spalten Matrix ..;) – LPs

1

OP will offenbar verwenden 'A', 'B', ... 'H' als 0,1,...7 für die Indexierung des Arrays board[][]. Doch 'A' hat einen Wert und es ist nicht 0, sondern typischerweise 65 - Der ASCII-Wert für das Zeichen A.

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

Verschiedene Lösungen

Vernünftigerweise tragbar basierte Compiler

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

C11 tragbare unter Verwendung der Verbindung wörtliche ASCII - nicht praktisch, sondern für Spaß.

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

oder einfach verwenden Sie 0 bis 7

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

OP hat sicherlich ein zweites Problem

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