使用指针构建strend函数

时间:2013-03-10 21:37:18

标签: c function pointers

正如标题所说,我必须使用指针构建一个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;
}

3 个答案:

答案 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;