我正在尝试编写一个比较两个字符串(s1和s2)的函数,并按字母顺序(与读取字典的方式相同)判断s1是在s2字符串之前,之后还是等于s2字符串。如果s1在s2之前,它应该返回-1。如果它等于s2,它应该返回0.如果它在s2之后它应该返回1.
我很难让函数工作 - 我似乎只能获得每个字符串中第一个字符的返回值,并且只使用相同的情况。感谢您提供的任何帮助。
到目前为止,这是代码:
#include <stdio.h>
#include <stdlib.h>
int cmpstr(const char *, const char *);
int main()
{
printf("Test 1: %d\n", cmpstr( "Hello", "World"));
printf("Test 2: %d\n", cmpstr( "Hello", "Hello"));
printf("Test 3: %d\n", cmpstr( "World", "Hello"));
return 0;
}
int cmpstr(const char *s1, const char *s2)
{
/*compare corresponding string characters until null is reached*/
while(*s1 != '\0' && *s2 != '\0' )
{
if (*s1 < *s2)
{
return -1;
}
else if (*s1 > *s2)
{
return 1;
}
else
{
return 0;
s1++;
s2++;
}
}
return 0;
}
答案 0 :(得分:1)
在else语句中删除'return 0'将起作用。如果字符在相同级别上相等,则需要查看下一个字符,直到相等性中断。
编辑:此外,您需要考虑字符串长度不相等的时间。
int cmpstrMY(const char *s1, const char *s2)
{
char sc1, sc2;
/*compare corresponding string characters until null is reached*/
while (1)
{
sc1 = towlower(*s1);
sc2 = towlower(*s2);
if (sc1 == '\0' && sc2 == '\0') {
break;
}
else if (sc1 == '\0' && sc2 != '\0') {
return -1;
}
else if (sc1 != '\0' && sc2 == '\0') {
return 1;
}
else if (sc1 < sc2)
{
return -1;
}
else if (sc1 > sc2)
{
return 1;
}
else
{
s1++;
s2++;
}
}
return 0;
}
你的cmpstr必须像上面的代码一样。
答案 1 :(得分:1)
只删除最后一个else部分并将return 0置于循环之外,因为如果如果部分而 else-如果部分不成立,则两个字符串仅相等它将从循环中返回,它将返回0。
int cmpstr(const char *s1, const char *s2)
{
/*compare corresponding string characters until null is reached*/
while(*s1 != '\0' && *s2 != '\0' )
{
if (*s1 < *s2)
{
return -1;
}
else if (*s1 > *s2)
{
return 1;
}
s1++;
s2++;
}
return 0;
}
答案 2 :(得分:1)
您的代码有一个非常明显的错误,即return 0
- 语句使s1++;s2++
无法访问代码(您的编译器应该警告您)。
但它也存在概念上的错误,因为它忽略了s1
长于s2
的情况,反之亦然。因此,在您的方法中(一旦更正return 0
- 事物,"Hello"
和"Hello there"
将相等。
以不同方式查看以下代码。它跳过相同的字符,直到一个(或两个)字符串结束。然后,根据这种状态,确定结果:
int cmpstr(const char *s1, const char *s2)
{
while (*s1 && *s2 && *s1 == *s2) { // move forward until either one of the strings ends or the first difference is detected.
s1++;
s2++;
}
int result = (*s1 - *s2);
// if both strings are equal, s1 and s2 have reached their ends and result is 0
// if *s1 > *s2, s1 is lexographically greater than s2 and result is positive
// if *s1 < *s2, s1 is lexographically lower than s2 and result is negative
// normalize "positive" and "negative" to 1 and -1, respectively
if (result < 0)
result = -1;
else if (result > 0)
result = 1;
return result;
}