【发布时间】:2021-03-28 09:10:38
【问题描述】:
我正在编写一个 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]);
其他功能也类似。
【问题讨论】:
-
那不是维度,是索引。
-
name[i] 指向name的第i个元素的字节0,相当于name[i][0]
-
方括号中的数字是声明数组时的维度,使用时是索引。
-
name[i]是ith 字符串;name[i][0]是ith 字符串中的第一个字符;&name[i][0]是ith 字符串中第一个字符的地址,与name[i]具有相同的值。对strlwr()(一个非标准函数——在标准C 或POSIX 中不是)的调用将char (*)[10]传递给一个需要char *的函数。您需要致电strlwr(name[i]);。scanf("%s", &name[i][0]);和scanf("%s", name[i]);均有效且等效。 -
@IcanCode:不;字符串处理函数采用指向字符串第一个字符的指针。所有这些——好吧,所有标准的,无论如何。
strlen(name[i])是正确的;strchr(name[i], 'A')是正确的,strcmp(name[i], name[i+1]) == 0是正确的,如果i不是太大(或负数)。
标签: c pointers multidimensional-array implicit-conversion c-strings