[英]Compraring Char array without using strcmp in C
我正在寻找一种方法来比较没有strcmp的2个char数组。 这是要走的路吗? 或者我错过了什么? 当我编译它时,如果我在两者中键入相同的字符串,程序就会卡住并且不会做任何事情。 请帮忙!
编辑:抱歉,这是一个我不是一个C
int compare_info(char *array1, char *array2)
{
int i;
i = 0;
while(array1[i] == array2[i])
{
if(array1[i] == '\0' || array2[i] == '\0')
break;
i++;
}
if(array1[i] == '\0' && array2[i] == '\0')
return 0;
else
return-1;
}
在这里你有一个解决方案
int compare_info(char *array1, char *array2)
{
if ((array1 == NULL) || (array2 == NULL))
return 0;
while ((*array1 != '\0') && (*array2 != '\0') && (*array1 == *array2))
{
array1++;
array2++;
}
return (*array1 == *array2);
}
或许你更喜欢这个
int compare_info(char *array1, char *array2)
{
int i;
i = 0;
if ((array1 == NULL) || (array2 == NULL))
return 0;
while ((array1[i] != '\0') && (array2[i] != '\0') && (array1[i] == array2[i]))
{
i++;
}
return (array1[i] == array2[i]);
}
你可以使参数const
成为更好的样式,因为如果你只想比较字符串,你保证函数不会修改它们我的意思是compare_info(const char *array1, const char *array2)
在这里你有一个解决方案,就像你的代码一样,但我做了一些改变。 我在循环中间取出了返回,因为它们破坏了结构,这样就更容易分析了。 完成后,我添加了一个新的条件,所以当找到字符串的结尾时,循环结束
int compare_info(char *array1, char *array2)
{
int i;
int response = 0;
i = 0;
while(array1[i] == array2[i] && response == 0 )
{
if(array1[i] == '\0' || array2[i] == '\0'){
response = 1;
}
i++;
}
return response;
}
除了其他答案之外,我还会在没有strcmp
情况下将以下内容添加到混合中作为strcmp
外观相似:
int strcmp_nohdr (char *s1, char *s2)
{
if (!s1 && !s2) return 0;
if (s1 && !s2) return 1;
if (!s1 && s2) return -1;
while (*s1 && *s2 && *s1 == *s2) s1++, s2++;
if (!*s1 && !*s2) return 0;
else if (*s1 > *s2) return 1;
else return -1;
}
实例/输出:
$ strcmp_nohdr mydog mycat
s1 is greater than s2
$ strcmp_nohdr mybat mycat
s1 is less than s2
$ strcmp_nohdr mycat mycat
s1 is equal to s2
$ strcmp_nohdr mycat myca
s1 is greater than s2
$ strcmp_nohdr myca mycat
s1 is less than s2
另一个替代方案是调用和组装例程来做同样的事情。
与某些人不同,我倾向于尽早捕获空指针(通过程序崩溃和调试器),所以我避免在下面检查空指针。 换句话说,不要将空指针传递给这些函数。
str_neq
函数确定字符串是否相等,这似乎是基于您的代码的正确逻辑(如果相等则返回0 / false,如果不相等则返回-1 / true):
int
str_neq (const char *s1, const char *s2)
{
while (*s1 != '\0' && *s1 == *s2)
++s1, ++s2;
return -(*s1 != *s2);
}
要提供与strcmp
相同的行为,需要对计算返回值的表达式进行少量更改:
int
str_compare (const char *s1, const char *s2)
{
while (*s1 != '\0' && *s1 == *s2)
++s1, ++s2;
return *s1 - *s2;
}
我希望这有帮助! :-)
不久:
int compare_info(char * array1, char * array2)
{
char * ptr1 = array1;
char * ptr2 = array2;
while(*ptr1 && *ptr2 && *ptr1++==*ptr2++);
if(!*ptr1 && !*ptr2 && *(ptr1-1)==*(ptr2-1)) return 0;
return -1;
}
当两个数组相同时返回0,否则返回-1。 (它与strcmp不相同。)
以下函数应该模仿strcmp
的确切行为:
int compare_info(const char* array1,const char* array2)
{
int i;
for (i=0; array1[i]!=0 && array2[i]!=0; i++)
{
if (array1[i] > array2[i])
return +1;
if (array1[i] < array2[i])
return -1;
}
if (array1[i] != 0)
return +1;
if (array2[i] != 0)
return -1;
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.