gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:24:15 24 4
gpt4 key购买 nike

我正在编写一个 C 程序,它从用户输入字符串按字母顺序排序。
我在这里有两个问题。
当我以这种方式从用户输入字符串时,不会发生错误。

for(int i =0; i < 7; i++)
{
printf("Enter the name %d\n",i+1);
scanf("%s",&name[i][0]);
}
name[i][0] 是什么意思如果
    char name[7][10];
为什么我们在这里将第二个索引设置为 0,第二个维度不是我们的数组可以处理的字符串的最大长度。
我的第二个问题是
对于这种类型的数组,字符串处理函数需要什么 &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] 类型的一维数组。 .
在表达式数组中使用的指示符(很少有异常(exception),例如用作 sizeof 运算符的操作数)被转换为指向它们的第一个元素的指针。
所以表达式 names[i]例如用作函数 scanf 的参数转换为指向其第一个元素的指针。也就是说这个表达式等价于 &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]);

关于c - C中字符和字符串函数的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65344751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com