我正在尝试在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.我做错了什么,如何纠正这个问题?
要获得所需的输出,您不希望使用任何类型的赋值。您可能已经知道,赋值是指将一个内存设置为等于另一个内存。换句话说,复制。代码中的这三行都是赋值并导致副本:
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
。您只是打印已经存在的内容,因此无需移动任何东西。当然,有很多方法可以编写这些函数。事实上,有一种方法可以将两个函数都写成一个函数。但这是一个简单的方法,只需很少的开销。