我尝试使用二维字符数组存储字符串,然后我想使用函数strcmp
比较两个相邻的字符串。
这是代码,它是成功的代码。
#include<stdio.h>
#include<string.h>
int main()
{
char a[20][20];
for(int i=0;i<20;i++)
scanf("%s",a[i]);//input
for(int i=1;i<20;i++)
{
if(strcmp(a[i],a[i-1])>0)//compare
{
//do something here
}
}
return 0;
}
当我尝试使用a+i
替代a[i]
时,就会出现问题。(我是指针的初学者,在我看来这两个表达式是相同的)
第二个代码是下面的代码。
#include<stdio.h>
#include<string.h>
int main()
{
char a[20][20];
for(int i=0;i<20;i++)
scanf("%s",a+i);//input
for(int i=1;i<20;i++)
{
if(strcmp(a+i,a+i-1)>0)//compare
{
//do something here
}
}
return 0;
}
编译器告诉我在if(strcmp(a+i,a+i-1)>0)//compare
行中有以下消息。
[Error] cannot convert 'char (*)[20]' to 'const char*' for argument '1' to 'int strcmp(const char*, const char*)'
我很困惑这个问题。但是,如果我只使用a+i
作为输入部分,那么效果很好。因此,我想了解a+i
和a[i]
之间的区别以及为什么a+i
无法投放作为strcmp
的参数,但它可以在scanf
中使用。
谢谢。
答案 0 :(得分:2)
简短答案:a[i]
解析为*(a+i)
。注意星号“ *”。
长答案:a[i]
在语义级别上旨在访问数组 a 的元素 i 。这是通过在内存中找出 a 的开头的地址,然后向其添加元素大小的 i 倍来找到目标元素的位置来完成的。
除此之外,单独调用 a (数组名称)将解析为该数组的地址,从而解析为指针类型的表达式。此外,“指针算术”指出,当组合整数值和指针值时,增量是指针元素的大小。因此,例如,如果您将32位整数指向a=0x80000000
,则a+1
将是0x80000004
。
答案 1 :(得分:0)
a
是一个char数组。 strcmp
需要类型为const char *
的参数。
a[i]
解析为*(a+i)
,即ith元素,在您的情况下为char数组。所以你还好。
a+i
是第ith个元素的指针。您应该尊重这一点,以获取元素:*(a+i)
。