我的老师指派我在C中编写自己的strcmp()
函数。我确实创建了我自己的函数版本,我希望得到一些反馈。
int CompareTwoStrings ( char *StringOne, char *StringTwo ) {
// Evaluates if both strings have the same length.
if ( strlen ( StringOne ) != strlen ( StringTwo ) ) {
// Given that the strings have an unequal length, it compares between both
// lengths.
if ( strlen ( StringOne ) < strlen ( StringTwo ) ) {
return ( StringOneIsLesser );
}
if ( strlen ( StringOne ) > strlen ( StringTwo ) ) {
return ( StringOneIsGreater );
}
}
int i;
// Since both strings are equal in length...
for ( i = 0; i < strlen ( StringOne ); i++ ) {
// It goes comparing letter per letter.
if ( StringOne [ i ] != StringTwo [ i ] ) {
if ( StringOne [ i ] < StringTwo [ i ] ) {
return ( StringOneIsLesser );
}
if ( StringOne [ i ] > StringTwo [ i ] ) {
return ( StringOneIsGreater );
}
}
}
// If it ever reaches this part, it means they are equal.
return ( StringsAreEqual );
}
StringOneIsLesser,StringOneIsGreater,StringsAreEqual被定义为const int,其值分别为:-1,+ 1,0。
事情是,我并不完全确定,例如,我的StringOne的长度是否比StringTwo长,这自动意味着StringTwo更大,因为我不知道如何strcmp()
特别实施。我需要你的一些反馈意见。
答案 0 :(得分:6)
这么简单的任务太多了。我相信这样做会很简单:
int my_strcmp(char *a, char *b)
{
while (*a && *b && *a == *b) { ++a; ++b; }
return (unsigned char)(*a) - (unsigned char)(*b);
}
答案 1 :(得分:3)
strcmp
按字母顺序排列:"aaa" < "b"
即使&#34; b&#34;更短。
因此,您可以跳过长度检查,然后进行逐字母比较。如果到目前为止两个字符串相等时你得到一个NULL字符,那么较短的字符是较小的字符。
另外:make StringsAreEqual == 0
,而不是1
,以便与标准排序功能兼容。
答案 2 :(得分:0)
尝试这一点也是为了更好地理解:
#include <stdio.h>
#include <string.h>
int main(void)
{
char string1[20], string2[20];
int i=0,len=0, count=0;
puts("enter the stirng one to compare");
fgets(string1, sizeof(string1), stdin);
len = strlen(string1);
if(string1[len-1]=='\n')
string1[len-1]='\0';
puts("enter the stirng two to compare");
fgets(string2, sizeof(string2), stdin);
len = strlen(string2);
if(string2[len-1]=='\n')
string2[len-1]='\0';
if(strlen(string1)==strlen(string2))
{
for(i=0;string1[i]!='\0', string2[i]!='\0', i<strlen(string1);i++)
{
count=string1[i]-string2[i];
count+=count;
}
if(count==0)
printf("strings are equal");
else if(count<0)
printf("string1 is less than string2");
else if(count>0)
printf("string2 is less than string1");
}
if(strlen(string1)<strlen(string2))
{
for(i=0;string1[i]!='\0', i<strlen(string1);i++)
{
count=string1[i]-string2[i];
count+=count;
}
if(count==0)
printf("strings are equal");
else if(count<0)
printf("string1 is less than string2");
else if(count>0)
printf("string2 is less than string1");
}
if(strlen(string1)>strlen(string2))
{
for(i=0;string2[i]!='\0', i<strlen(string2);i++)
{
count=string1[i]-string2[i];
count+=count;
}
if(count==0)
printf("strings are equal");
else if(count<0)
printf("string1 is less than string2");
else if(count>0)
printf("string2 is less than string1");
}
return 0;
}
答案 3 :(得分:0)
int mystrncmp(const char * str1, const char * str2, unsigned int n)
{
while (*str1 == *str2) {
if (*str1 == '\0' || *str2 == '\0')
break;
str1++;
str2++;
}
if (*str1 == '\0' && *str2 == '\0')
return 0;
else
return -1;
}
答案 4 :(得分:0)
strcmp()
很容易编写代码。常见的错误编码问题包括:
参数类型
strcmp(s1,s2)
使用const char *
类型,而不使用char *
类型。这允许使用指向const
数据的指针来调用该函数。它向用户传达功能的数据未更改。它可以帮助优化。
无符号比较
即使对str...()
进行了签名,所有char
函数的执行也好像unsigned char
是char
一样。当字符串不同并且找到范围[1...CHAR_MAX]
以外的字符时,这很容易影响结果。
范围
在某些实现中,unsigned char
减去unsigned char
的范围超出了int
的范围。使用2个比较(a>b) - (a-b)
可以避免任何问题,而不是a-b;
。进一步:许多编译器认识到这种惯用法并发出良好的代码。
int my_strcmp(const char *s1, const char *s2) {
// All compares done as if `char` was `unsigned char`
const unsigned char *us1 = (const unsigned char *) s1;
const unsigned char *us2 = (const unsigned char *) s2;
// As long as the data is the same and '\0' not found, iterate
while (*us1 == *us2 && *us1 != '\0') {
us1++;
us2++;
}
// Use compares to avoid any mathematical overflow
// (possible when `unsigned char` and `unsigned` have the same range).
return (*us1 > *us2) - (*us1 < *us2);
}
答案 5 :(得分:0)
bool str_cmp(char* str1,char* str2)
{
if (str1 == nullptr || str2 == nullptr)
return false;
const int size1 = str_len_v(str1);
const int size2 = str_len_v(str2);
if (size1 != size2)
return false;
for(int i=0;str1[i] !='\0' && str2[i] !='\0';i++)
{
if (str1[i] != str2[i])
return false;
}
return true;
}