C语言 当打印一个字符矩阵时,我得到了不同的输出

jw5wzhpr  于 2023-03-01  发布在  其他
关注(0)|答案(3)|浏览(139)

我正在尝试编写一个游戏"雷区"。我认为最好的方法是使用一个字符矩阵。我询问用户的难度,填充矩阵,然后输出结果,看看是否工作,但它没有,以下代码:

#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来创建矩阵,但是得到了相同的输出。

kcrjzv8t

kcrjzv8t1#

Ciao,正如已经指出的,您正在使用字符串常量来初始化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';
    }
}

你可以使用标头<string.h>中声明的标准C函数memset

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循环中使用numCols而不是numRows
要输出二维数组,您可以只使用一个for循环,例如

for(int i = 0; i < numRows; i++){ 
    printf( "%.*s\n", numCols, field[i] );       
}

还有这些if语句

if(d==1){
    numCols=9;
    numRows=9;
}
else if (d==2){
    numCols=16;
    numRows=16;
}
else{
    numCols=30;
    numRows=16;   
}

如果引入枚举,则可读性会更强。

enum { Principiante = 1, Intermedio = 2, Esperto = 3 };

switch ( d )
{
default:
case Principiante:
    numCols=9;
    numRows=9;
    break;

case Intermedio:
    numCols=16;
    numRows=16;
    break;

case Esperto:
    numCols=30;
    numRows=16;   
    break;
}

char field[numRows][numCols];

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

for(int i = 0; i < numRows; i++){ 
    printf( "%.*s\n", numCols, field[i] );       
}
zpgglvta

zpgglvta2#

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

正在分配从 * 字符串文本 *(数组)"a"转换为field[i][j]的指针。
要存储字符,应执行以下操作:

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

如果出于某种原因想坚持使用字符串文字量,可以执行以下操作:

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

或:

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

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

ars1skjm

ars1skjm3#

关键的错误在于没有使用好的编译器启用所有警告。

field[i][j] = "a";  // bad

......很容易被警告为问题。

warning: assignment to 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]

通过启用许多警告进行修复。示例:-pedantic -Wall -Wextra -Wconversion,含gcc和:

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

相关问题