打印 char 矩阵时得到不同的输出

问题描述 投票:0回答:2

我正在尝试对游戏 Minefield 进行编程。我认为制作该字段的最佳方法是使用 char 矩阵。我向用户询问难度,填充矩阵然后输出结果只是为了看看是否有效,但它没有,这是代码:

#include <stdio.h>
#include <stdlib.h>

int selectDifficulty(){
    int d;
    do{
        printf("--------Selezionare difficolta' del campo minato--------\n");
        printf("1: Principiante (9x9)\n");
        printf("2: Intermedio (16x16)\n");
        printf("3: Esperto (30x16)\n");
        printf(">>>: ");
        scanf("%d", &d);
    }while(d<1 || d>3);
    return d;
}

int main(){
    int d,numCols,numRows;
    
    d = selectDifficulty();

    //Create numRows x numRows matrix based on difficulty d
    if(d==1){
        numCols=9;
        numRows=9;
    }
    else if (d==2){
        numCols=16;
        numRows=16;
    }
    else{
        numCols=30;
        numRows=16;   
    }
    
    char field[numRows][numCols];
    
    for(int i = 0; i < numRows; i++){      
        for(int j = 0; j < numCols; j++){
            field[i][j] = "a";
        }
    }
    for(int i = 0; i < numRows; i++){      
        for(int j = 0; j < numRows; j++){
            printf("%c",field[i][j]);
        }
        printf("\n");
    }
    return 0;
}

这是我得到的输出:

ÕÕÕÕÕÕÕÕÕ
ÕÕÕÕÕÕÕÕÕ
ÕÕÕÕÕÕÕÕÕ
ÕÕÕÕÕÕÕÕÕ
ÕÕÕÕÕÕÕÕÕ
ÕÕÕÕÕÕÕÕÕ
ÕÕÕÕÕÕÕÕÕ
ÕÕÕÕÕÕÕÕÕ
ÕÕÕÕÕÕÕÕÕ

我做错了什么?

我尝试使用 malloc 来制作矩阵,但我得到了相同的输出。

c
2个回答
1
投票
field[i][j] = "a";

正在分配一个从 string literal(数组)

"a"
转换为
field[i][j]
.

的指针

要存储一个字符,你应该这样做:

field[i][j] = 'a';

如果出于某种原因你想坚持使用字符串文字,你可以这样做:

field[i][j] = "a"[0];

或:

field[i][j] = *"a";

一定要打开编译器警告来捕获像这样的简单错误。


0
投票

正如已经指出的那样,您正在使用字符串文字来初始化

char
.

类型的对象
field[i][j] = "a";

在这种情况下,字符串文字

"a"
被隐式转换为指向其第一个类型
char *
的指针,实际上您有

field[i][j] = &"a"[0];

您必须使用整数字符常量而不是字符串文字

'a'

field[i][j] = 'a';

也代替嵌套的 for 循环

for(int i = 0; i < numRows; i++){      
    for(int j = 0; j < numCols; j++){
        field[i][j] = 'a';
    }
}

您可以使用标头

memset
中声明的标准C函数
<string.h>
。例如

memset( field, 'a', sizeof( field ) );

此外,您在输出数组的嵌套 for 循环中也有拼写错误

for(int i = 0; i < numRows; i++){      
    for(int j = 0; j < numRows; j++){
                   ^^^^^^^^^^^
        printf("%c",field[i][j]);
    }
    printf("\n");
}

您必须在内部 for 循环中使用

numRows
而不是
numCols

为了输出二维数组,你只使用一个 for 循环,例如

for(int i = 0; i < numRows; i++){ 
    printf( "%.*s\n", numCols, field[i] );       
}
© www.soinside.com 2019 - 2024. All rights reserved.