我尝试使用二维字符数组存储字符串,然后我想使用函数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 (*)[30]' to 'const char*' for argument '1' to 'int strcmp(const char*, const char*)'
我对这个问题感到很困惑。但是,如果我仅将a+i
用作输入部分,那么我想知道a+i
和a[i]
之间的区别,以及为什么a+i
不能用作strcmp
的参数,但是它可以在scanf
中使用。
谢谢。
简短回答:a[i]
解析为*(a+i)
。注意星号“ *”。
长答案:在语义级别上,a[i]
用于访问数组a的元素i。在内部,这是通过找出a的起始地址在内存中,然后将元素大小乘以[[i倍以找到目标元素的位置来完成的。
a
(数组名)将解析为该数组的地址,从而解析为指针类型的表达式。此外,“指针算术”指出,当组合整数值和指针值时,增量是指针元素的大小。因此,例如,如果您将32位整数指向a=0x80000000
,则a+1
将为0x80000004
。