2017-08-09 5 views
-2

私は戦艦をプレイするプログラムを書いています。 私は戦場を表す文字列行列を持っています。変数をインデックスとして使用してchar * [] []にアクセスすると、要素の内容は(null)

#define NUM_CASELLE 6 

char* campo[NUM_CASELLE][NUM_CASELLE]; 

プログラムの開始時に、行列の各要素は " - "で初期化されます。

私はより良い問題が何であったかを理解するためにいくつかのデバッグを行なったし、私は、この気づいたので、私は問題は行列の要素にアクセスしていることに気づいた:私は

printf("The content is %s\n", campo[3][1]); 

を書いた場合、結果は

です内容は -

です。

しかし、私は標準入力から座標を入力し、変数にそれらを覚えている場合、

printf("row is %c\n", row); 
printf("col is %d\n", col); 
printf("The content is %s\n", campo[row][col]); 

結果は次のとおりです。

コンテンツがある(ヌル)

午前間違ってる?

とにかく、エラーが他の場所にある可能性があるため、コード全体を投稿します。 実際には、座標はa3やb5、f1などの戦艦に入力されています。そして、その文字をそれぞれの行インデックスに変換します。

#define NUM_CASELLE 6 
#define NUM_NAVI 7 

int pos_size = 256; 

char* campo[NUM_CASELLE][NUM_CASELLE]; 

void posizionaNavi(){ 
    char pos[pos_size]; 
    int i = 0; 
    int col; 
    int row; 

    printf("Scegli dove posizionare le navi...\n"); 

    while(i < NUM_NAVI){ 
     printf("Posizionare nave numero %d...\n", i + 1); 
     fgets(pos, pos_size, stdin); 

     col = isCommandValid(pos); 
     row = pos[1]; 

     if(col == -1){ 
      printf("\n"); 
      printf(">> ATTENZIONE: formato errato.\n"); 
      printf(">> Le colonne vanno dalla lettera A alla lettera F\n"); 
      printf(">> Le righe vanno dal numero 1 al numero 6\n"); 
      printf(">> Esempi di comando valido: a3 - b6 - f1\n"); 
      printf("\n"); 
     } 
     else{ 
      printf("row is %c\n", row); 
      printf("col is %d\n", col); 
      printf("The content is %s\n", campo[row][col]); 
      printf("The content is %s\n", campo[3][1]); 

      if(campo[row][col] = " - "){ 
       campo[row][col] = " x "; 
       printf("Nave %d posizionata in %s\n", i + 1, pos); 
       i++; 
      } 
      else{ 
       printf(">> ATTENZIONE: casella già occupata da una nave."); 
       printf(">> Riprovare...\n"); 
       printf("\n"); 
      } 
     } 
    } 
} 

int isCommandValid(char* pos){ 
    int ret; 

    if(strlen(pos) != 3 || pos[1] > '6' || pos[1] < '1') 
     return -1; 

    switch(pos[0]){ 
     case 'a': 
      ret = 1; 
      break; 
     case 'A': 
      ret = 1; 
      break; 
     case 'b': 
      ret = 2; 
      break; 
     case 'B': 
      ret = 2; 
      break; 
     case 'c': 
      ret = 3; 
      break; 
     case 'C': 
      ret = 3; 
      break; 
     case 'd': 
      ret = 4; 
      break; 
     case 'D': 
      ret = 4; 
      break; 
     case 'e': 
      ret = 5; 
      break; 
     case 'E': 
      ret = 5; 
      break; 
     case 'f': 
      ret = 6; 
      break; 
     case 'F': 
      ret = 6; 
      break; 
     default: 
      ret = -1; 
      break; 
    } 

    return ret; 
} 
+0

しますか? –

+2

これは2つの理由から間違っています: 'if(campo [row] [col] =" - "){'。まず、比較演算子は '='ではなく '=='です。次に、文字列を '=='と比較することはできません。あなたは 'strcmp()'を使う必要があります。 – Barmar

+0

私はcampo [3] [1]と入力すると正しくコンテンツが " - "になるはずです –

答えて

1

1.

case 'f': 
    ret = 6; 
    break; 
case 'F': 
    ret = 6; 
    break; 

==と文字列の比較はできません

case 'F': 
case 'f': 
    ret = 6; 
break; 

2. 容易になります。 strcmp()を使用する必要があります。

strcmp(campo[row][col], "-") 

3. あなたがどこかにそれらを貼り付けている場合は特に、プログラムのアメリカ英語でを記述する必要があります。

4. いけないチェック戻り値のに忘れます。

5。

char* campo[NUM_CASELLE][NUM_CASELLE]; 

あなたが今campo[x][x]を行うことができますので、

char campo[NUM_CASELLE][NUM_CASELLE]; 

に変更し、二重の配列へのポインタです。

6.

row = pos[1]; 

ここでは、文字のASCII値を代入している、あなたがするコンテンツを何を期待している

row = pos[1] - '0'; 
-1

はい。合ってます。あなたのテーブルはポインタの2次元配列です。ポインタ以外のものは保存できません。あなたがあれば、セルが有効なものを指すことができ

  1. 有効なポインタをセルの割り当てメモリを割り当てて、その割り当てられたメモリ

    campo[x][y] = malloc(size); 
    strcpy(campo[x][y], "Hello."); 
    
  2. で何かを保存

    char str[] = "hello"; 
    char *str1 = "HELLO"; 
    campo[x][y] = str; 
    campo[n][n] = str1; 
    campo[a][b] = "Hello Again"; 
    
  3. 既にポインタを有効な文字列のアドレスは、のような文字列のcomparitionのオペレータでは何もありません

if(campo[row][col] = " - ") - 「 - 」とifが真実とさせて頂きます文字列リテラルのアドレスをカンポ[行] [COL]を割り当てます。 「 - 」場合

if(!strcmp(campo[row][col] , " - "))チェックする有効なポインタが常にゼロ以外の整数にキャスト(しかし、あなたは警告を受ける)として

if(campo[row][col] == " - ")は、文字列リテラルのアドレスをポインタカンポ[行] [COL]を比較します両方の文字列が等しい

+0

あなたがdownvote場合は任意のコメント –

+0

私のdownvoteではありませんが、あなたの答えの最初のバージョンが短すぎると実際に質問に答えなかったのでおそらくdownvotedされました。 –

0

if(campo[row][col] = " - "){は、割り当てであり、文字列でもポインタでもないテストで、@barmarとなります。

文字列を比較するには、おそらくstrcmp()のコードを使用する必要があります。

if(strcmp(campo[row][col], " - ") == 0) { 

OPは "行列がで初期化された "と言います - "。"これは上記の比較対象とは異なります。

// This is not initialization, only a defintion without initialization  
char* campo[NUM_CASELLE][NUM_CASELLE]; 

... 
// potential unposted "initialization" code, needed for each campo[row][col] 
campo[row][col] = "-"; // this will not compare as above 
campo[row][col] = " - "; // this will compare as above 

私は未転記コードはcampo[row][col]やその他の問題のトラブルがあると疑われます。

関連する問題