c - strnicmp在c中的实现

标签 c string implementation

我试图从linux源代码中理解strnicmp的实现。 http://lxr.free-electrons.com/source/lib/string.c

我只是尝试在没有额外变量 c1 和 c2 的情况下实现它,并在 while 中添加了一些条件。

int StrNiCmp(const char *s1, const char *s2, size_t len)
{
    if(!len)
    return 0;

    do {
            if(!(*s1) || !(*s2))
            break;

            if(*s1 == *s2)
            continue;

            if(ToLower(*s1) != (ToLower(*s2)))
            break;
    } while(len-- && *s1++ && *s2++) ;

    return (int)(*s1) - (int)(*s2);

}

所以我的疑问是上面的实现有任何潜在的错误。 我检查了一些基本测试用例以验证其功能是否正常。没有任何额外变量是个好主意

最佳答案

与官方实现相比,这节省了 1 个寄存器。这是我的想法,只用一些简单的案例进行了测试。

int StrNiCmp(const char *s1, const char *s2, size_t len)
{
    int diff = 0;
    while (!diff && len-- && *s1 && *s2) {
        if (*s1 != *s2)
            diff = (int)ToLower(*s1) - (int)ToLower(*s2);
        s1++;
        s2++;
    }
    return diff;
}

这个可能会稍微更有效率:

int StrNiCmp(const char *s1, const char *s2, size_t len)
{
    int diff = 0;
    while (len-- && *s1 && *s2) {
        if (*s1 != *s2)
            if (diff = (int)ToLower(*s1) - (int)ToLower(*s2))
                break;
        s1++;
        s2++;
    }
    return diff;
}

关于c - strnicmp在c中的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40988538/

相关文章:

java - 在 Java 中更改接口(interface)常量的实用替代方案

c - 二进制数据转整数?

c - 为什么使用后要检查指针是否为NULL?

java - Java中的继承是如何实现的?

java - 匹配两个字符串中长度为 2(同一索引)的子序列

java - 为什么 'concat'不改变字符串?

c++ - 友元函数中的 STL 问题

c - 如何正确标准化 q15 定点中的 pid 系数

c - 返回指向 C 中 int 指针的指针的函数

java - 存储字符串数组唯一列表的最佳方式