如果两个字符数组的长度不相等,是否有合适的方法来比较它们?如何检查哪个字符不相等?
strcmp 似乎只给我更大或更小的数字,而不是不平等字符的位置。
例如,字符串:
/home/jjjj/ and
/home/jjjj/kkkk/asdasd
应该返回 12
使用strlen()
andstrstr()
您可以通过两步方法实现此目的:
#include <string.h>
#include <stdio.h>
...
char str1[] = "this is a long string";
char str2[] = "long";
{
char * ss = NULL;
char * sg = NULL;
size_t size1 = strlen(str1)
size_t size2 = strlen(str2);
size_t size_ss = 0;
/* step 1: determine which of the two strings tobe compared it the smaller/greater one. */
if (size1 > size2)
{
size_ss = size2;
ss = str2;
sg = str1;
}
else
{
size_ss = size1;
ss = str1;
sg = str2;
}
/* step 2: find out where the smaller string is located in the greater one, if ever... */
{
char * p = strstr(sg, ss);
if (p)
{
printf("'%s' is the same as '%s' from character %zu to character %zu.\n",
sg, ss, p - sg, p - sg + size_ss);
}
else
{
/* printf("The strings are 100%% differently!\n"); */ /* changed as per Jonathan's comment. */
printf("'%s' does not appear in '%s'.\n", ss, sg);
}
}
}
该解决方案没有考虑到较短的字符串可能在较长的字符串中出现多次。它总是通知第一次出现。
没有标准的 C 函数可以返回两个字符串之间的第一个差异点。
创建一个并不难。strcmp()
从教科书中获取一个版本并对其进行修改,以便返回字符串在结果“有趣”处的偏移量。如果字符串相等,那将是空终止符 ( '\0'
) 的偏移量;否则,这将是两个字符串不同的偏移量。
也许是这样的:
const char* strcmp_plusplus (const char* str1, const char* str2)
{
const char* result = NULL; // return NULL if equal
while(*str1 != '\0')
{
if(*str1 != *str2)
{
result = str1; // point at where in str1 they are different
break;
}
str1++;
str2++;
}
return result;
}
请注意,我们不必检查 str2 是否为\0
,因为 C 标准允许我们在不调用未定义行为的情况下读取数组之外的一个元素。如果 str2 在 str1 之前结束,该函数将返回一个指向 str1 的空终止的指针。
此功能尝试一次完成所有操作。由于函数只能返回一个值,因此必须通过指向它的指针将结果值之一(差异)传递回调用者。
#include <stdio.h>
size_t lead_cmp( const char * one, const char * two, int *result);
size_t lead_cmp( const char * one, const char * two, int *result)
{
size_t pos;
for(pos=0; one[pos] && two[pos]; pos++) {
if (one[pos] != two[pos]) break;
}
*result = one[pos] - two[pos];
return pos;
}
int main(int argc, char **argv)
{
size_t len;
int diff;
len = lead_cmp (argv[1], argv[2], &diff );
printf( "Pos=%zu, Rc=%d\n", len, diff);
return 0;
}
结果:
$ ./a.out /home/jjjj/ /home/jjjj/kkkk/
Pos=11, Rc=-107
$
找到的位置是 11,而不是 12,因为 C 使用基于 0 的索引。
它返回匹配字符的数量:公共前缀的长度。