我对C中的字符串比较grass
函数感到有些困惑。
如果您有两个字符串,grapes
和strcmp(grass, grapes);
并且您使用guard
会产生39或任何正数,这是否意味着" grape"在" grass"之前按字母顺序排列,或者相反?
我知道如果结果是0,他们就会相等。
答案 0 :(得分:0)
strcmp的返回值在C99 7.21.4中定义
比较函数memcmp,strcmp返回的非零值的符号, 和strncmp由第一个值的差异符号决定 在对象中不同的字符对(都被解释为unsigned char) 相比较。 因此,如果结果为正,则意味着第二个参数位于第一个参数之后。
这不完全是字母顺序,而是依赖于characers的底层编码。例如,在ASCII中,'B' < 'a'
,因为'B'编码为66而'a'是97.如果字符都是相同大小写的字母,则这将等同于所有字母顺序(非多字节编码我很熟悉,但我不相信这是必需的。
对于像“草”和“葡萄”这样的情况,它只会继续扫描,直到找到不同的字符(在这种情况下为“s”与“p”),然后做出决定。一个特殊情况是当一个字符串是另一个字符串的子字符串时:例如“葡萄”与“葡萄”。对于这种情况,你只需要记住“葡萄”实际上是{ 'g', 'r', 'a', 'p', 'e', '\0' }
,并应用正常规则:'\0' < 's'
,所以“葡萄”出现在“葡萄”之前。
这将是strcmp的一致性实现:
int strcmp(const char *a, const char *b) {
size_t i = 0;
while (a[i] || b[i]) {
if (a[i] != b[i]) {
if (a[i] < b[i]) return -1;
else return 1;
}
i++;
}
return 0;
}
答案 1 :(得分:0)
strcmp
函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同或者到达终止空字符为止。
这意味着,此函数执行字符的二进制比较。
以下程序应该让您了解strcmp
的工作原理:
#include <stdio.h>
#include <string.h>
int stringcmp(char *s1, char *s2){
int count = 0;
while (s1[count] == s2[count]) {
if (s1[count] == '\0' || s2[count] == '\0')
break;
count++;
}
if (s1[count] == '\0' && s2[count] == '\0'){
return 0;
}
if(strlen(s1) < strlen(s2)){
return -1;
}else{
return 1;
}
}
int main(void){
char *b = "grass";
char *a = "grapes";
if(stringcmp(a, b) == 0){
printf("Are equal.\n");
printf("Length of A = %zu\n",strlen(a));
printf("Length of B = %zu\n",strlen(b));
printf("Return of stringcmp = %d\n",stringcmp(a, b));
}else{
printf("Are not equal.\n");
printf("Length of A = %zu\n",strlen(a));
printf("Length of B = %zu\n",strlen(b));
printf("Return of stringcmp = %d\n",stringcmp(a, b));
}
return 0;
}
输出:
Are not equal. Length of A = 5 Length of B = 6 Return of stringcmp = -1
如果您与b交换,则获得:
Are not equal. Length of A = 6 Length of B = 5 Return of stringcmp = 1
如果A和B相同:
Are equal. Length of A = 5 Length of B = 5 Return of stringcmp = 0