【问题标题】:Understanding 2D Char Array in C了解 C 中的二维字符数组
【发布时间】:2018-04-04 17:07:24
【问题描述】:
#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/” 我正在努力理解它。我了解二维数组如何工作的基本思想,其中第一个数组是索引,第二个数组是索引的内容。但是,我对发生了什么感到困惑

if (strcmp(arr[j], arr[i]) > 0)
            {
                strcpy(temp, arr[j]);
                strcpy(arr[j], arr[i]);
                strcpy(arr[i], temp);
            }

我不明白 arr[][MAX] 中的 arr[j] 或 arr[i] 指的是什么

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

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

【问题讨论】:

  • 这听起来可能没什么用,但我真诚地建议使用笔和纸并模拟一个简单的案例。
  • 我想说我们在编程中并没有真正的意识形态:o

标签: c arrays string sorting


【解决方案1】:

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

但是,我对什么时候发生的事情感到困惑......

举个例子,假设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() 将返回值 &gt; 0if 条件导致 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() 函数中被交换。

希望这能澄清你的疑虑。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 并且传递给函数strcmpstrcpy的数组最好是nul-terminated作为“string”函数不接受数组作为参数——除非它们正确地以 nul 结尾。
    • 不错的收获。谢谢。
    【解决方案3】:

    因此,二维数组是一个连续的内存块,不由语言本身划分。当您引用 arr[i] 时,它假定字符串从 arr[i] 开始,就内存位置而言,它是 (arr + (i-1) * MAX)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2019-02-18
      • 2021-03-28
      • 1970-01-01
      相关资源
      最近更新 更多