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]);
我正在编写一个 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]);