【问题标题】:How to reverse a multidimensional array in C?如何在C中反转多维数组?
【发布时间】:2014-06-03 00:15:17
【问题描述】:

我需要反转一个用指针表示法制作的二维数组。

要清楚,如果数组是

A B C D E
F G H I J
K L M N O

我需要:

E D C B A
J I H G F
O N M L K

到目前为止我的代码:

#include <stdio.h>
#include <stdlib.h>
#define HEIGHT 3
#define WIDHT 7

void print (char *imprimir)
{
    int i,j;
    for (i=0;i<HEIGHT;i++)
    {
        for (j=0;j<WIDHT;j++)
        {
            printf ("%2c",*(imprimir+(i*WIDHT)+j));
        }
        printf ("\n");
    }
}

int main()
{
    //FILLING THE ARRAY
    char *array=malloc(WIDHT*HEIGHT);
    int i,j;
    for (i=0;i<HEIGHT;i++)
    {
        for (j=0;j<WIDHT;j++)
        {
            *(array+(i*WIDHT)+j)=(i*WIDHT)+j+'a';
        }
    }
    print (array);  
    //TRYING TO REVERSE IT
    char *tmp=malloc(WIDHT);
    for (i=0;i<HEIGHT;i++)
    {
        for (j=0;j<WIDHT/2;j++);
        {
            *tmp=*(array+(i*WIDHT)+j);
            *(array+(i*WIDHT)+j)=*(array+(i*WIDHT)+(WIDHT-j));
            *(array+(i*WIDHT)+(WIDHT-j))=*tmp;
        }
    }
    printf ("PRINTING RESULT!\n");
    print (array);  
}

【问题讨论】:

    标签: c arrays multidimensional-array


    【解决方案1】:

    你有两个错误。

    1. 您的内部 for 循环末尾有一个分号 ;,因此循环根本没有运行。
    2. 无论您在哪里使用WIDTH - j,都应该使用WIDTH - 1 -j,因为最高索引是WIDTH - 1

    此外,人类确实关心拼写,因此我将WIDHT 全局更改为WIDTH 以提高可读性。

    这里是固定代码。

    #include <stdio.h>
    #include <stdlib.h>
    #define HEIGHT 3
    #define WIDTH 7
    
    void print (char *imprimir)
    {
        int i,j;
        for (i=0;i<HEIGHT;i++)
        {
            for (j=0;j<WIDTH;j++)
            {
                printf ("%2c",*(imprimir+(i*WIDTH)+j));
            }
            printf ("\n");
        }
    
    }
    
    
    
    int main ()
    {
        //FILLING THE ARRAY
        char *array=malloc(WIDTH*HEIGHT);
        int i,j;
        for (i=0;i<HEIGHT;i++)
        {
            for (j=0;j<WIDTH;j++)
            {
                *(array+(i*WIDTH)+j)=(i*WIDTH)+j+'a';
            }
        }
        print (array);  
        //TRYING TO REVERSE IT
        char tmp;
        for (i=0;i<HEIGHT;i++)
        {
            for (j=0;j<WIDTH/2;j++)
            {
                tmp=*(array+(i*WIDTH)+j);
                *(array+(i*WIDTH)+j)=*(array+(i*WIDTH)+(WIDTH - 1 -j));
                *(array+(i*WIDTH)+(WIDTH - 1 -j))=tmp;
            }
        }
        printf ("PRINTING RESULT!\n");
        print (array);  
    
    }
    

    【讨论】:

    • 谢谢!!这么多时间只是为了那个愚蠢的错误......我真的很感谢你的帮助,我很抱歉我的范围不允许我投票给你的答案。谢谢
    • @sirpsychosexy,这是一个很难发现的错误。我自己最近遇到了一个字符错误(有一个额外的&amp;),所以我知道你的感受。
    【解决方案2】:

    至少是字符串for (j=0;j&lt;WIDHT/2;j++); 中的错误,因为您不希望那里有一个空循环,对吧? 这是您的代码:

        #include <stdio.h>
        #include <stdlib.h>
        #define HEIGHT 3
        #define WIDHT 7
    
        void print (char *imprimir)
        {
            int i,j;
              for (i=0;i<HEIGHT;i++)
            {
                for (j=0;j<WIDHT;j++)
                {
                    printf ("%2c",*(imprimir+(i*WIDHT)+j));
                }
                printf ("\n");
            }
    
        }
    
    
    
        int main ()
        {
            //FILLING THE ARRAY
            char *array=malloc(WIDHT*HEIGHT);
            int i,j;
            for (i=0;i<HEIGHT;i++)
            {
                for (j=0;j<WIDHT;j++)
                {
                    *(array+(i*WIDHT)+j)= (i*WIDHT)+j+'a';
                }
            }
            print (array);  
            //TRYING TO REVERSE IT
            char *tmp=malloc(WIDHT);
            for (i=0;i<HEIGHT;i++)
            {
                for (j=0;j<WIDHT/2;j++)
                {
                    *tmp=*(array+(i*WIDHT)+j);
                    *(array+(i*WIDHT)+j)=*(array+(i*WIDHT)+(WIDHT-j-1));
                    *(array+(i*WIDHT)+(WIDHT-j-1))=*tmp;
                }
            }
            printf ("PRINTING RESULT!\n");
            print (array);  
    
    }
    

    【讨论】:

    • 我发现了第二个错误,这是我的工作代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2019-08-28
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多