首页 > 解决方案 > 如何以相反的顺序打印二维字符串数组

问题描述

我正在尝试在 C 中创建一个函数,该函数将通过在每次迭代中用第一行索引替换最后一行索引来交换我的二维数组的索引,直到整个数组完全反转。例如,给定的字符串示例:

I am human
hello world
et is real
i am the knight

应该输出:

i am the knight
et is real
hello world
I am human

使用我的交换功能。相反,我得到的输出(最后一个字符串被切断)是这样的:

Ih am human
eello world
it is real

我掀起的功能,看起来像这样:

void swap(char array[][COLS], int start, int end)
{
    for(int i = 0; i >= ROWS; i++)
    {
        int temp = array[start][i];
        array[start][i] = array[end][i];
        array[end][i] = temp;
        end--;
    }
}

我已将 ROWS 和 COLS 定义为大小 100。我做错了什么以及如何纠正这个问题?

标签: carraysreverse

解决方案


要获得所需的输出,您不想使用任何类型的分配。您可能已经知道,赋值是指将一块内存设置为与另一块相等。换句话说,抄袭。代码中的这三行都是赋值并导致复制:

int temp = array[start][i];
array[start][i] = array[end][i];
array[end][i] = temp;

以下方法将要求您的字符串数组定义如下:

char** array = {
    "I am human",
    "hello world",
    "et is real",
    "i am the knight"
};

由于您要做的就是以相反的顺序打印内容,因此您只需从最后一行开始,然后回到开始行。如果这是您的打印功能

void printStrings(char** array, int start, int end)
{
    while(start!=end)
    {
        printf("%s\n",array[start]);
        ++start;
    }
}

您可以这样称呼它以正常顺序打印字符串:

printStrings(array,0,3);

或者

printStrings(array,0,sizeof(array)-1);

并且要以相反的顺序打印它,您需要一个不同的功能:

void printStringsReverse(char** array, int end, int start)
{
    while(end!=start)
    {
        printf("%s\n",array[end]);
        --end;
    }
}

你会这样调用这个函数:

printStringsReverse(array,3,0);

或者

printStringsReverse(array,sizeof(array)-1,0);

不需要分配。不制作副本。没有malloc使用。您只是打印已经存在的内容,因此无需移动任何内容。当然,您可以通过多种方式编写这些函数。事实上,有一种方法可以将两个函数编写为一个函数。但这是一个简单的方法,开销很小。


推荐阅读