gpt4 book ai didi

c - strcmp() 是如何工作的?

转载 作者:太空狗 更新时间:2023-10-29 16:29:04 25 4
gpt4 key购买 nike

我一直在四处寻找答案。我将制作一系列我自己的字符串函数,如 my_strcmp()my_strcat() 等。

strcmp() 是否遍历两个字符数组的每个索引,如果 ASCII 值在两个字符串的相同索引处较小,则该字符串按字母顺序排列较大,因此为 0 或 1或 2 被退回?我想我想问的是,它是否使用字符的 ASCII 值来返回这些结果?

如有任何帮助,我们将不胜感激。

[修订]

好的,所以我想到了这个……它适用于所有情况,除非第二个字符串大于第一个。

有什么建议吗?

int my_strcmp(char s1[], char s2[])
{
int i = 0;
while ( s1[i] != '\0' )
{
if( s2[i] == '\0' ) { return 1; }
else if( s1[i] < s2[i] ) { return -1; }
else if( s1[i] > s2[i] ) { return 1; }
i++;
}
return 0;
}


int main (int argc, char *argv[])
{
int result = my_strcmp(argv[1], argv[2]);

printf("Value: %d \n", result);

return 0;

}

最佳答案

strcmp 的伪代码“实现”会是这样的:

define strcmp (s1, s2):
p1 = address of first character of str1
p2 = address of first character of str2

while contents of p1 not equal to null:
if contents of p2 equal to null:
return 1

if contents of p2 greater than contents of p1:
return -1

if contents of p1 greater than contents of p2:
return 1

advance p1
advance p2

if contents of p2 not equal to null:
return -1

return 0

基本上就是这样。依次比较每个字符,然后根据该字符决定第一个字符串还是第二个字符串更大。

只有当字符相同时才移动到下一个字符,如果所有字符都相同,则返回零。

请注意,您不一定会得到 1 和 -1,规范说明任何正值或负值都足够,因此您应该始终使用 < 0 检查返回值, > 0== 0 .

把它变成真正的 C 会相对简单:

int myStrCmp (const char *s1, const char *s2) {
const unsigned char *p1 = (const unsigned char *)s1;
const unsigned char *p2 = (const unsigned char *)s2;

while (*p1 != '\0') {
if (*p2 == '\0') return 1;
if (*p2 > *p1) return -1;
if (*p1 > *p2) return 1;

p1++;
p2++;
}

if (*p2 != '\0') return -1;

return 0;
}

另请记住,字符上下文中的“更大”不一定基于所有 字符串函数的简单 ASCII 排序。

C 有一个称为“locales”的概念,它指定(除其他事项外)排序规则,或底层字符集的排序,例如,您可能会发现字符 a , á , àä都被认为是相同的。对于 strcoll 之类的函数,会发生这种情况.

关于c - strcmp() 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12136329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com