扩展2d矩阵

时间:2013-10-25 17:49:13

标签: c multidimensional-array

我输入矩阵迷宫[3] [3]为

asd
usd
psd

我希望将其转换为两个矩阵mazeW [3] [4]和mazeE [3] [4]形式

Wasd 
Wusd
Wpsd

asdE
usdE
psdE

我该怎么办? 我尝试了这个,但没有帮助

for(int i=0;i<row;i++)
{
strcpy("W",strcpy(mazeW[i],maze[i]));
strcpy(strcpy(mazeE[i],maze[i]),"E");
}

3 个答案:

答案 0 :(得分:2)

如果您使用的是strcpy函数,则源字符串必须以'\ 0'结尾, 在您的代码迷宫[3] [3]中似乎不是一个字符串数组,因为没有为'\ 0'保留空间。

在这种情况下,你使用strcpy函数代替使用memcpy,你可以提供要复制的内存大小。

for ( i=0; i < row; i++ )
{
    mazeW[i][0] = 'W';
    memcpy ( mazeW[i]+1, maze[i], 3); 

    mazeE[i][3] = 'E';
    memcpy ( mazeE[i], maze[i], 3);
}

答案 1 :(得分:1)

for(i=0;i<3;i++)
{
    mazeW[i][0] = 'W';  //sets the first element of each line to W
    memcpy(&mazeW[i][1], maze[i], sizeof(char)*3);   //copies the rest of the line from maze

    mazeE[i][3] = 'E';  // sets the last element of each line to E
    memcpy(&mazeE[i][0], maze[i], sizeof(char)*3);  ////copies the beggining of the line from maze
}

答案 2 :(得分:1)

如果没有发布更多的源代码,它看起来和听起来就像是在混淆数组和字符串。

在C和C ++中,'char'是一个8位值,通常用于存储ASCII字符。 ASCII表与周期表类似,它提供了编号的事物列表,以便您可以用数字方式引用它们。元素周期表中的1是氢,它是元素1.在ASCII中,值32表示空格字符,值48表示'0'字符,49表示'1'。

在C和C ++中,惯例是如果一个字符序列被认为是一个字符串,它们必须以一个ASCII值为0的字符结束(不是'0',而是0,也写' \ 0' )。

因此,存储一个3个字符的字符串,您需要4个字符或字节。

char foo[3] = "foo"; // illegal. "foo" is actually { 'f', 'o', 'o', 0 };
char bar[4] = "foo"; // ok

因为你的数组看起来是char数组而不是字符串,你不能使用“strcpy”等,你必须使用“memcpy”或手工复制元素。

以下是您要解决的问题的工作版本,希望这会有所帮助。

在ideone上进行在线演示:http://ideone.com/6TcapX

#include <stdio.h>
#include <string.h>

#define MAZE_COLUMNS 3
#define MAZE_ROWS 3
#define MAZEW_COLUMNS 4
#define MAZEE_COLUMNS 4

static void transcribeMazeRow(const char* source, size_t srcColumns, char prefix, char* dest, size_t destColumns)
{
    dest[0] = prefix;
    memcpy(&dest[1], &source[0], srcColumns * sizeof(source[0]));
}

int main(int argc, char* argv[])
{
    // 3 rows of 3 columns, each is a distinct char. this is not a string.
    char maze[MAZE_ROWS][MAZE_COLUMNS] = { { 'a', 's', 'd' }, { 'u', 's', 'd' }, { 'p', 's', 'd' } };

    // 3 rows of 4 columns, distinct character values, not a string.
    char mazeW[MAZE_ROWS][MAZEW_COLUMNS];
    char mazeE[MAZE_ROWS][MAZEE_COLUMNS];

    for (size_t row = 0; row < MAZE_ROWS; ++row) {
        transcribeMazeRow(maze[row], MAZE_COLUMNS, 'W', mazeW[row], MAZEW_COLUMNS);
        transcribeMazeRow(maze[row], MAZE_COLUMNS, 'E', mazeE[row], MAZEE_COLUMNS);
    }

    // this part is mostly to show the poster the correct way to refer to all elements of each array.
    printf("maze: %c%c%c, %c%c%c, %c%c%c\n",
            maze[0][0], maze[0][1], maze[0][2],
            maze[1][0], maze[1][1], maze[1][2],
            maze[2][0], maze[2][1], maze[2][2]      );
    printf("mazeW: %c%c%c%c, %c%c%c%c, %c%c%c%c\n",
            mazeW[0][0], mazeW[0][1], mazeW[0][2], mazeW[0][3],
            mazeW[1][0], mazeW[1][1], mazeW[1][2], mazeW[1][3],
            mazeW[2][0], mazeW[2][1], mazeW[2][2], mazeW[2][3]      );
    printf("mazeE: %c%c%c%c, %c%c%c%c, %c%c%c%c\n",
            mazeE[0][0], mazeE[0][1], mazeE[0][2], mazeE[0][3],
            mazeE[1][0], mazeE[1][1], mazeE[1][2], mazeE[1][3],
            mazeE[2][0], mazeE[2][1], mazeE[2][2], mazeE[2][3]      );

    return 0;
}

输出:

maze: asd, usd, psd
mazeW: Wasd, Wusd, Wpsd
mazeE: Easd, Eusd, Epsd