正如标题所说,我必须使用指针构建一个strend函数。函数将检查第二个字符串是否出现在第一个字符串的末尾,如果是,则返回1,如果不是则返回0。这是我的代码,它没有编译,并且在分配错误中给出了一个非左值。任何想法?
#include <stdio.h>
#define MAX 100
int strend (char *s1,char *s2);
int main()
{
char string1[MAX]="Check Mate";
char string2[MAX]="Mate";
printf("The Result is :\n");
printf("%d",strend(string1,string2));
return 0;
}
int strend (char *s1,char *s2)
{
for(;*s1!='\0';s1++)
{ for(;*s2!='\0' && *s1!='\0' && *s1==*s2;s1++,s2++)
;
}
if(*s1='\0' && *s2='\0')
return 1;
else
return 0;
}
答案 0 :(得分:3)
编译器显示的错误表明您尝试分配的内容不是LVALUE
。简单来说,LVALUE
指的是可以出现在作业左侧的术语,(实际上它比那复杂得多;)
您需要使用==
进行相等性比较而不是=
if (*s1 == '\0' && *s2 == '\0')
return 1;
else
return 0;
另请注意,编译器在*s2 = '\0'
显示错误并且没有抱怨第一个作业*s1 = '\0'
(即使它在逻辑上不符合您的程序要求)。
换句话说,编译器不会仅使用以下语句显示LVALUE错误:
if (*s1 = '\0')
只有当您有&& *s2 = '\0'
时,才会显示错误。
正如teppic在下面的评论中所指出的,这是因为被评估的表达式等同于if(*s1 = ('\0' && *s2) = '\0')
(因为运算符优先级),这使得编译器显示LVALUE错误,因为你不能拥有{{1在表达式中。
答案 1 :(得分:0)
我需要将*s2!='\0'
添加到第一个For条件中。
答案 2 :(得分:0)
查看此代码段。
char str1[50]="Check Mate";
char str2[50]="Mate";
int flag,i,l1,l2;
l1=strlen(str1);
l2=strlen(str2);
/*
* Place a pointer to the end of strings 1 and strings 2 .
*/
char *ptrend1 = (str1+l1-1);
char *ptrend2 = (str2+l2-1);
flag = 1;
for(i=l2;i>0;i--)
{
/*
* Keep traversing such that in case the last charachters of the stings
* dont match break out .
*/
if(*ptrend2 != *ptrend1){
flag = 0 ;
break;
}
/*
* Decrement both the end pointers
*/
ptrend1--;
ptrend2--;
}
if(flag)
printf("String 2 is contained at the end of string 1");
else
printf("String 2 is NOT contained at the end of string 1");
return 0;