c - C 中的 strend 函数使用指针?

标签 c pointers

我为 strend 创建了一个函数,如果字符串 t 出现在字符串 s 的末尾,它基本上返回 1 ,但它永远不会返回1:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int strend(char *s, char *t) {
    int  p;
    for (p = 0; p < strlen(s) - strlen(t); p++) {
        *s++;
    }
    printf("%s\n%s\n", s, t);
    if (s == t)
        return 1;
    return 0;
}

int main(void) {
    int bool = strend("Hello", "ello");
    printf("%i\n", bool);
    return 0;
}

这给了我一个输出:

ello
ello
0

所以从技术上讲我应该得到1。我认为使用指针的比较不是以这种方式使用的?

最佳答案

您需要复习一下 C 字符串的基础知识。 string.h 中有很多标准字符串函数。这可以帮助您完成此测试。

基本问题是测试s == t是有效的,但您在这里比较内存地址。如果将要测试的字符串更改为

,您会发现这是有效的
char test[] = "Hello";
int bool = strend_(test, test+1);

哪里test显然与你的 "Hello" 相同,类似地,test+1"ello" 相同(通过打印来尝试)。 正确返回 1与你的日常习惯。

此外,我还收到两个警告:

  • *s++; “警告:表达式结果未使用 [-Wunused-value]”:您递增 s还可以通过 *s 询问该位置是什么字符;并且您不使用该信息。
    通过删除 * 进行修复那里。

  • p < strlen(s) .. ; “警告:比较不同符号的整数:‘int’和‘unsigned long’”,因为 strlen不返回有符号整数,而是返回无符号整数(显然,我的 header 使用 unsigned long )。
    通过声明 p 进行修复如unsigned long ,或者更好,size_t .

您的整个日常工作可以浓缩为一个简单的

int strend (char *s, char *t)
{
    if (strlen(s) >= strlen(t) && !strcmp (s+strlen(s)-strlen(t),t))
        return 1;
    return 0;
}

不值得这么麻烦地缓存这四个 strlen 的结果调用 2 个临时变量;一个好的编译器会解决这个问题并为你做这件事。 (快速浏览一下我正在使用的编译器的汇编输出 – clang – 显示它确实如此,即使使用默认的优化设置也是如此。)

根据 @M.M. 的评论稍作修改的测试:

int strend (char *s, char *t)
{
    if (strlen(s) < strlen(t)) return 0;
    return !strcmp (s+strlen(s)-strlen(t),t);
}

但是尝试以这种方式优化它并不像上面的例程那样容易解析,而且它的汇编也有点“冗长”。就我个人而言,我会选择更易于阅读的版本。

关于c - C 中的 strend 函数使用指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33532638/

相关文章:

c++ - 初始化类的常量字符指针

c - 运行一个程序,我将文件名传递给 Main

将 char 指针强制转换为 long

c - 我需要有关数组的帮助

c - libuv 结合了多个异步调用并调用一次回调

用递归函数计算数组的平均值

c - 指向结构的指针数组中的指针,如果设置为 NULL,是否分配内存?

c - C中Malloc的使用及指针成员错误

c++ - 取消引用指针会复制它吗?

c - 从函数 C 返回指针