如何在 C 语言中将字符串存储在 2D 数组中?

How to store strings in a 2D array in C?

提问人:Jonathan 提问时间:11/25/2022 最后编辑:Jonathan LefflerJonathan 更新时间:11/25/2022 访问量:77

问:

我想将字符串存储在数组中,但我不知道该怎么做。 二维数组中的每个单元格都可以包含 2 位数字的字母或数字。char *

|_|S|_|
|_|10|_|
|_|W|_|
|_|_|_|
|_|_|_|

我试过这个,我使用了结构:

struct Etage {
    char Idsalles[20];
    int** etage;
    int width;
    int height;
}; 


#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include "etage.h"

#define COLS 15
#define ROWS 9

Etage *createMap()
{
    Etage *e = malloc(sizeof(Etage));
    e->width = COLS;  // columns
    e->height = ROWS; // rows
    e->etage = malloc(sizeof(char *) * e->height);

    for (int i = 0; i < e->height; i += 1)
    {
        e->etage[i] = malloc(sizeof(char) * e->width);
        for (int j = 0; j < e->width; j += 1)
        {
            e->etage[i][j] = "0";
        }
    }

    return e;
}

void randomId(Etage *e, int maxSalles)
{
    srand(time(NULL));
    int i = 0;

    if (maxSalles < 10)
    {
        printf("Seulement %d disponibles, veuiller générer plus de salles.\n", maxSalles);
        return;
    }

    while (i < 10)
    {
        int id = (rand() % maxSalles) + 1; 
        int existe = testId(e, id);
        if (existe != 1)
        {
            e->Idsalles[i] = id;
            i += 1;
        }
    }
    
    return;
}

int testId(Etage *e, int id)
{
    for (int i = 0; i < 10; i += 1)
    {
        if (id == e->Idsalles[i])
        {
            return 1;
        }
    }
    return 0;
}

void printEtage(Etage *e)
{
    for (int i = 0; i < e->height; i += 1)
    {
        for (int j = 0; j < e->width; j += 1)
        {
            if(e->etage[i][j] == 0){
                printf("  ");
            }else{
                printf("%s", e->etage[i][j]);
                printf(" ");
            }
        }
        printf("\n");
    }

    printf("Id des salles de cette étage: ");
    for(int i =0; i <10;i+=1){
        printf("%d ",e->Idsalles[i]);
    }
    printf("\n");
}

void freeEtage(Etage *e)
{
    //free(e->etage);
    free(e);
}

void placerSalles(Etage* e){
    int a=ROWS/2;
    int b=COLS/2;
    //0 = Haut; 1 = Droite; 2 = Bas; 3 = Gauche
    e->etage[a][b] = e->Idsalles[0]+"\0";    // On place la premiere salle au centre de l'étage sa sera le spawner 'S'
    srand(time(NULL));
    int i = 1;
    while(i<10){
        int dir  = randomDirections();

        if(dir==0){ // On se déplace en haut
            a = a-1;    //On se déplace
            if(e->etage[a][b] == 0 && a > 0){
                e->etage[a][b] = e->Idsalles[i]+"\0";
                i+=1;
            }else{
              a = a+1;  // Sionon on revien a la derniere case connu
            }
        }else if(dir==1){   // On se déplace à droite
            b=b+1;
            if(e->etage[a][b] == 0 && b< e->width){
                e->etage[a][b] = e->Idsalles[i]+"\0";
                i+=1;
            }else{
                b = b-1;
            }
        }else if(dir==2){ // On se déplace en bas
            a = a+1;
            if(e->etage[a][b] == 0 && a>e->height){
                e->etage[a][b] = e->Idsalles[i]+"\0";
                i+=1;
            }else{
                a = a-1;
            }
        }else if(dir==3){ // On se déplace à gauche
            b = b-1;
            if(e->etage[a][b] == 0 && b>0){
                e->etage[a][b] = e->Idsalles[i]+"\0";
                i+=1;
            }else{
                b = b+1;
            }
        }
    }
}

int randomDirections(){
    int i = 0;
    int id = rand() % 4; // Remplacé 10 par le nbrSalles
    //printf("Position: %d\n",id);
    return id;
}

我对二维数组有很好的理解,但三个......

我尝试使用 .malloc

我什至不认为这是可能的......

数组 c 字符串 char malloc

评论

1赞 Lundin 11/25/2022
const char* array[x][y] = { {" ", "10", "blah", ...}, { "more", "strings", "here" } };.如果您需要它们可写,则 2 for 循环并分配 using 或类似。strdup
0赞 John Bollinger 11/25/2022
据我所知,按照你的要求去做并没有什么特别的技巧。因此,我有点不知所措。如果您尝试编写所需的代码,那么展示您的尝试可能有助于我们了解您的不确定性的本质。如果你还没有做过这样的尝试,那为什么不呢?
0赞 0___________ 11/25/2022
@Lundin它是指针数组,而不是字符串数组。
0赞 Jonathan 11/25/2022
@JohnBollinger 这就是我所做的。谢谢你的帮助
0赞 Lundin 11/25/2022
@0___________ “如何在 c 中的 2d 数组中存储字符串” 显然,它也不是字符的 3D 数组。

答:

2赞 0___________ 11/25/2022 #1

如果字符串长度不超过 2 个字符(字符串长度为 3 个字符)

char array[rows][cols][3] = {{"2", "a", "34"}, ... };

或使用 malloc

char (*array)[cols][3] = malloc(rows * sizeof(*array));