我有点困惑与字符串比较strcmp()
功能C.字符串比较C
当你有两个字符串,grass
和grapes
和使用strcmp(grass, grapes);
,导致39,或任何正数,不这意味着“葡萄”在“草”之前是按字母顺序排列的,还是相反?
我知道如果结果为0,它们是相等的。
我有点困惑与字符串比较strcmp()
功能C.字符串比较C
当你有两个字符串,grass
和grapes
和使用strcmp(grass, grapes);
,导致39,或任何正数,不这意味着“葡萄”在“草”之前是按字母顺序排列的,还是相反?
我知道如果结果为0,它们是相等的。
的strcmp的返回值在C99被定义7.21.4
由比较功能memcmp,的strcmp返回非零值的符号,并 STRNCMP由之间的差的符号来确定第一个 字符对的值(两者都解释为无符号字符),它们在 的对比中有所不同。 所以如果结果是肯定的,这意味着第二个参数在第一个之后。
它不是完全按字母顺序排列,而是依赖于编码的基础编码。例如,在ASCII中,'B' < 'a'
,因为'B'编码为66,'a'为97.如果这些字符都是相同大小写的字母,这将相当于所有(非多字节)编码I中的字母顺序我很熟悉,但我不相信这是必需的。
对于像“grass”和“grapes”这样的情况,它会继续扫描,直到找到不同的字符(在本例中为'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;
}
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
你的意思是'STRCMP( “草”, “葡萄”)'?如果*小于零*草在葡萄之前排序,如果*等于零*,则它们相等,如果*大于零*葡萄在草之前排序。 –
看看[这个链接](http://www.tutorialspoint.com/c_standard_library/c_function_strcmp.htm)。在Return Value下 –
如果你在linux上,你可以使用'man strcmp'。 – Jason