[英]Strcmp 1-D array vs 2-D array in c
当使用 strcmp 函数(在 string.h 库中),传递一个二维字符数组作为参数比较时,需要添加与符号,如
&mainlist[i][0]
否则喜欢
mainlist[i][0]
有一个错误
警告:传递 'strcmp' 的参数 1 使指针从整数而不进行强制转换 [-Wint-conversion]
与传递一维字符数组作为参数比较时,它就足够了
mainlist[i]
没有 & 符号。 怎么来的?
#include <stdio.h>
#include <string.h>
#define FOUND 1
#define NOT 0
int main()
{
char mainlist[5][10] = {"test1", "test2", "test3", "test4", "test5"};
int flag, i;
flag = NOT;
char myname[50];
printf("Enter ur name.\n");
scanf("%s", myname);
for(i = 0; i < 5; i++)
{
if(strcmp(mainlist[i], myname)== 0) //vs if(strcmp(&mainlist[i][0]), myname)==0)
{
flag = FOUND;
printf("Your name was found welcome.\n");
break;
}
}
if(flag == NOT)
{
printf("Your name was not found .\n");
}
}
当使用 strcmp 函数(在 string.h 库中),传递一个二维字符数组作为参数比较时,需要添加与符号,如:
&mainlist[i][0]
mainlist[i][0]
不是二维数组,它是字符串的第一个字符:a char
。 &mainlist[i][0]
采用指向该char
的指针,即char *
。 这只是说mainlist[i]
的一种复杂方式。
每个数组索引都会取消引用。 mainlist
是一个char **
。 mainlist[i]
是一个char *
并且mainlist[i][j]
是一个char
。
char mainlist[5][10] = {"test1", "test2", "test3", "test4", "test5"};
记忆中是这样的。
1 2 3 4
01234567890123456789012345678901234567890123456789
test1_____test2_____test3_____test4_____test5_____
^
|
mainlist
其中_
表示一个空字节。 mainlist
指向包含第一个字符的内存。
当您要求mainlist[i]
表示将i * 10
添加到mainlist
的地址并取消引用它时。 你可以直接写*mainlist + i * 10
mainlist[1] mainlist[3]
| |
v v
1 2 3 4
01234567890123456789012345678901234567890123456789
test1_____test2_____test3_____test4_____test5_____
^ ^ ^
| | |
mainlist[0] mainlist[2] mainlist[4]
指向字符串第一个字符的指针就是 C 中的字符串,即char *
。 每一个都是一个字符串,一个一维数组,适合传递给strcmp
。
mainlist[i][0]
表示获取mainlist[i]
的地址,添加 0,然后取消引用它。 结果是一个char
像t
。 这不适用于strcmp
,因为它需要一个指针。 “警告:传递 'strcmp' 的参数 1 使指针在没有强制转换 [-Wint-conversion] 的情况下从整数生成指针”中的整数是char
,因为字符只是整数,而strcmp
试图使用该整数作为char
指针。
&mainlist[i][0]
表示要创建一个指向该char
的指针,所以我们回到char *
或mainlist[i]
。
示范。
mainlist[i]
几乎总是优于&mainlist[i][0]
。 然而,它确实有它的用途。 有时您想跳过字符串的前几个字符,您可以在不复制或修改字符串的情况下这样做。 例如, &mainlist[2][2]
是"st3"
。 它是一个指向mainlist[2]
+ 2 的指针。
&mainlist[2][2]
|
v
01234567890123456789012345678901234567890123456789
test1_____test2_____test3_____test4_____test5_____
^
|
mainlist[2]
C 将从指针读取直到空字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.