我正尝试在C中创建一个函数,该函数将通过在每次迭代中将最后一个行索引替换为第一个行索引来交换2D数组的索引,直到整个数组完全反转为止。例如,给定的字符串示例:
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。我在做什么错,我该如何纠正?
答案 0 :(得分:1)
要获得所需的输出,您不想使用任何分配。您可能已经知道,分配是指将一个内存设置为等于另一个内存。换句话说,就是复制。您代码中的以下三行都是赋值的,并且会导致复制:
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
。您只需打印已经存在的内容,因此无需四处移动。当然,可以通过多种方式编写这些功能。实际上,有一种方法可以将两个函数编写为一个函数。但这是一种简单的方法,几乎没有开销。