繁体   English   中英

了解C中的2D字符数组

[英]Understanding 2D Char Array in C

#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 [j]或arr [i]指的是什么

printf("\n String %d is %s", i+1, arr[i]);

我也对arr [i]的印刷中发生的事情感到困惑。 是否应该确定哪个索引包含哪些内容正在打印? 很抱歉,如果我的问题令人困惑,我是2D数组的新手。

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]表示数组arr i 索引处的字符串(考虑到i的值是数组arr的有效索引wrt)。

但是,我很困惑....

让我们举个例子,假设j=2i=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"

这样在sortStrings()函数中交换字符串。

希望这能澄清你的疑虑。

其他语言认为多维数组在C中实现为数组数组。 例如,数组int foo [3] [3]实现为大小为3的数组,其元素是数组类型(int类型的大小为3的数组)。

抛开数组表达式转换为参数中的指针,示例中发生的是arr [i]和arr [j]指的是数组arr的偏移量i和j处的char类型的MAX数组,因此将数组传递给strcmp和strcpy函数,用于比较存储在这些数组中的字符串。

因此,2D数组是一个连续的内存块,不受语言划分。 当你引用arr [i]时,它假设字符串从arr [i]开始,就内存位置而言是(arr +(i-1)* MAX)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM