C中字符和字符串函数的二维数组

Two Dimensional Array of a character and string function in C

我正在编写一个 C 程序,该程序将用户输入的字符串按字母顺序排序。 我这里有两个问题。

当我以下面这种方式从用户输入字符串时,没有发生错误。

for(int i =0; i < 7; i++)
{
    printf("Enter the name %d\n",i+1);
    scanf("%s",&name[i][0]);
}

name[i][0] 是什么意思 if

    char name[7][10];

为什么我们这里设置第2个索引为0,第2维不是我们数组能处理的最大字符串长度吗

我的第二个问题是 对于这种类型的数组,字符串处理函数需要什么 &name[i][0]&name[i]?

到目前为止我写的代码给了我想要的输出但是有很多警告

#include<stdio.h>
#include<string.h>

int main() {
  char name[7][10];
  for (int i = 0; i < 7; i++) {
    printf("Enter the name %d\n", i + 1);
    scanf("%s", & name[i]);
    strlwr( & name[i]);
  }
  //Sort in alphabetical order
  for (int i = 0; i < 7; i++) {
    for (int j = i + 1; j < 7; j++) {
      if (strcmp( & name[i][0], & name[j][0]) > 0) {
        char temp[10];
        strcpy(temp, & name[i]);
        strcpy(name[i], & name[j]);
        strcpy(name[j], & temp);
      }
    }
  }
  printf("The names in alphabetical order is\n");
  for (int i = 0; i < 7; i++) {
    puts(name[i]);
  }
}

警告是:

 warning: passing argument 1 of 'strlwr' from incompatible pointer type [-Wincompatible-pointer-types]
           98 |         strlwr(&name[i]);

其他功能也类似。

names[i] 是声明为数组的一个元素

char name[7][10];

类型为 char[10]。也就是说,这个二维数组的元素是 char[10].

类型的一维数组

用于表达式的数组指示符(极少数例外,例如用作 sizeof 运算符的操作数)被转换为指向其第一个元素的指针。

因此,用作函数 scanf 参数的表达式 names[i] 被转换为指向其第一个元素的指针。即这个表达式等价于&names[i][0].

所以不是这个调用

scanf("%s",&name[i][0])

你可以写

scanf("%s", name[i] )

用作参数的两个表达式都具有 char *

类型

这次scanf的调用

scanf("%s", & name[i]);

参数类型不正确。表达式 &name[i] 的类型为 char ( * )[10],而函数需要一个类型为 char * 的参数,尽管两个表达式的值彼此相等。

如果你有一个像

这样声明的数组
char name[7][10];

那么这些表达式的值

&name
&name[0] 
&name[0][0]

彼此相等,并产生数组占用的内存范围的第一个字节的地址。

但是表达式的类型不同。他们是

char ( * )[7][10]
char ( * )[10]
char *

这是一个演示程序

#include <stdio.h>

int main(void) 
{
    char name[7][10];
    
    printf( "&name       = %p\n", ( void * )&name );
    printf( "&name[0]    = %p\n", ( void * )&name[0] );
    printf( "&name[0][0] = %p\n", ( void * )&name[0][0] );

    return 0;
}

它的输出可能看起来像

&name       = 0x7ffec1d18e40
&name[0]    = 0x7ffec1d18e40
&name[0][0] = 0x7ffec1d18e40

由于上述原因,这些调用的参数

    strcpy(temp, & name[i]);
    strcpy(name[i], & name[j]);

也有不正确的类型 char ( * )[10] 而函数需要 char *.

类型的参数

你需要写

    strcpy(temp, name[i]);
    strcpy(name[i], name[j]);