C函数使用指针将字符串的最后元素与另一个元素进行比较

时间:2016-01-24 22:54:48

标签: c pointers

我的问题是查看str1是否以str2的内容结尾。

我试过了:

int string_ends_with(const char *str1, const char *str2) {
    int len;
    len = strlen(str2);

    while ((*str1 == '\0' - len) && *str1 != '\0') {
        if (strcmp(str1, str2) == 0) {
            return 1;
        } else {
            return 0;
        }
    }
}

int main() {
    char str[10] = "banana";
    char str1[5] = "ana";

    string_ends_with(str, str1);

    return 0;
}

我做错了什么?

只需使用指针即可解决此问题。

3 个答案:

答案 0 :(得分:5)

while语句中的这个条件

while((*str1 == '\0' - len) && *str1 != '\0')

没有意义。 '\0' - len是什么意思?

您可以按以下方式编写该功能

int string_ends_with(const char *str1, const char *str2)
{
    size_t n1 = strlen( str1 );
    size_t n2 = strlen( str2 );

    return n2 <= n1 && strcmp( str1 + n1 - n2, str2 ) == 0;
}

如果您不使用标准功能,则可以按以下方式编写功能

int string_ends_with(const char *str1, const char *str2)
{
    const char *p1 = str1;
    const char *p2 = str2;

    while ( *p1 ) ++p1;
    while ( *p2 ) ++p2;

    while ( p1 != str1 && p2 != str2 && *p1 == *p2 ) --p1, --p2;

    return  p2 == str2 && *p1 == *p2;
}

答案 1 :(得分:0)

如果您想知道哪个字符串具有更大/更小的值,这将非常有用。

int string_ends_with(char *p1, char *p2)
{
    char    *q1;
    char    *q2;

    if (! p1 || ! p2)
        return something;

    (p1 + (strlen(p1) - 1));
    (p2 + (strlen(p2) - 1));

    while (q1 >= p1 && q2 >= p2) {
       if (*q2 < *q1) return -1;
       else if (*q2 > *q1) return 1;

       q1--; q2--;
    }

    return 0;
}

编辑:当然要进行基本的错误检查,我认为这是最常用的,并且不希望在一个简单的例子中使用不必要的代码来混乱我的微薄产品。不过,不要惹恼任何羽毛。

好的。

答案 2 :(得分:0)

您的初始测试不正确,如其他答案中所述。

这是一个稍小且可能更有效的版本:

int string_ends_with(const char *str1, const char *str2) {
    const char *p1 = str1;
    const char *p2 = str2;

    while (*p1) p1++;  // same as p1 += strlen(p1);
    while (*p2) p2++;  // same as p2 += strlen(p2);

    while (p2 != str2) {
        if (p1 == str1 || *--p1 != *--p2)
            return 0;
    }
    return 1;
}

请注意,您的main测试函数应输出内容并执行更多测试:

void test(const char *a, const char *b) {
    printf("\"%s\" ends with \"%s\": %s\n", 
           a, b, string_ends_with(a, b) ? "yes" : "no");
}

int main(void) {
    char str[] = "banana";
    char str1[] = "ana";

    test(str, str1);
    test(str1, str);
    test(str, str);
    test(str, "");
    test("", str);
    test("", "");

    return 0;
}