我一直在寻找答案。我将制作一系列自己的字符串函数,例如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有一个称为“语言环境”的概念,它指定(除其他事项外)排序规则或基础字符集的顺序,例如,您可能会发现字符
a
,á
,à
和ä
都被视为相同。像strcoll
这样的函数会发生这种情况。关于c - strcmp()如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12136329/