#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void sortStrings(char arr[][MAX], int n)
{
char temp[MAX];
int j, i;
// Sorting strings using bubble sort
for (j=0; j<n-1; j++)
{
for (i=j+1; i<n; i++)
{
if (strcmp(arr[j], arr[i]) > 0)
{
strcpy(temp, arr[j]);
strcpy(arr[j], arr[i]);
strcpy(arr[i], temp);
}
}
}
}
int main(int argc, char *argv[])
{
char arr[][MAX] = {"GeeksforGeeks","Quiz","Practice","Gblogs","Coding"};
int n = sizeof(arr)/sizeof(arr[0]);
int i;
sortStrings(arr, n);
printf("Strings in sorted order are : ");
for (i=0; i<n; i++)
printf("\n String %d is %s", i+1, arr[i]);
return 0;
}
我直接从GeeksForGeeks获取此代码进行冒泡排序“https://www.geeksforgeeks.org/sorting-strings-using-bubble-sort-2/” 而我正试图理解它。我理解2D数组如何工作的基本思想,第一个数组是索引,第二个数组是索引的内容。但是,我很困惑
时发生了什么if (strcmp(arr[j], arr[i]) > 0)
{
strcpy(temp, arr[j]);
strcpy(arr[j], arr[i]);
strcpy(arr[i], temp);
}
我不明白arr []或arr [i]在arr [] [MAX]中指的是什么
printf("\n String %d is %s", i+1, arr[i]);
我也对arr [i]的印刷中发生的事情感到困惑。是否应该确定哪个索引包含哪些内容正在打印?很抱歉,如果我的问题令人困惑,我是2D数组的新手。
答案 0 :(得分:2)
arr
的内存中视图将是这样的:
index 0 1 2 3 4 5 6 7 8...............99
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
arr[0] |G|e|e|k|s|f|o|r|G|e|e|k|s|0|...|0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
arr[1] |Q|u|i|z|0|.....................|0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
arr[2] |P|r|a|c|t|i|c|e|0|.............|0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
arr[3] |G|b|l|o|g|s|0|.................|0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
arr[4] |C|o|d|i|n|g|0|.................|0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
arr[i]
表示数组i
的{{1}} th 索引处的字符串(考虑arr
的值是数组的有效索引wrt i
)。
然而,我很困惑.......
让我们举个例子,假设arr
和j=2
,字符串数组i=3
的内容与上面显示的相同(内存中的视图)。<登记/>
声明
arr
将是
if (strcmp(arr[j], arr[i]) > 0)
,因为
if (strcmp("Practice", "Gblogs") > 0)
在这种情况下,arr[j] --> arr[2] --> "Practice"
and
arr[i] --> arr[3] --> "Gblogs"
将返回值strcmp()
,> 0
条件会导致if
,这两个字符串将按如下方式进行交换:
true
这会将strcpy(temp, arr[j]);
(arr[2]
)的内容复制到数组"Practice"
。
注意:temp
将源复制到目标,包括终止空字符。
strcpy()
这会将strcpy(arr[j], arr[i]);
的内容复制到arr[3]
。在此之后,arr[2]
到arr[3]
将具有相同的值,即arr[2]
"Gblogs"
这会将数组strcpy(arr[i], temp);
的内容复制到temp
。在此之后,arr[3]
将arr[3]
因此,在交换"Practice"
和arr[2]
的内容后
arr[3]
这样,字符串就会在arr[2] --> "Gblogs"
arr[3] --> "Practice"
函数中交换。
希望这能澄清你的疑虑。
答案 1 :(得分:1)
其他语言认为多维数组在C中实现为数组数组。例如,数组int foo [3] [3]实现为大小为3的数组,其元素是数组类型(int类型的大小为3的数组)。
暂且不论该阵列表达式转换为在参数指针,什么是在例如发生的是,ARR [i]和ARR [j]的指的字符类型的大小MAX的阵列在偏移i和阵列j的arr,因此将数组传递给strcmp和strcpy函数,用于比较存储在这些数组中的字符串。
答案 2 :(得分:0)
因此,2D数组是一个连续的内存块,不会被语言划分。当你引用arr [i]时,它假设字符串从arr [i]开始,就内存位置而言是(arr +(i-1)* MAX)。