C-确定字符/字符串的字母顺序
我正在尝试编写一个函数来比较两个字符串(s1和s2),并按字母顺序计算s1是在s2字符串之前、之后还是等于s2字符串(与阅读词典的方式相同)。如果s1在s2之前出现,则应返回-1。如果它等于s2,则应返回0。如果在s2之后,则应返回1 我很难让函数工作——我似乎只能得到每个字符串中第一个字符的返回值,而且只能使用相同的大小写。感谢你能给予的任何帮助 以下是迄今为止的代码:C-确定字符/字符串的字母顺序,c,arrays,string,char,C,Arrays,String,Char,我正在尝试编写一个函数来比较两个字符串(s1和s2),并按字母顺序计算s1是在s2字符串之前、之后还是等于s2字符串(与阅读词典的方式相同)。如果s1在s2之前出现,则应返回-1。如果它等于s2,则应返回0。如果在s2之后,则应返回1 我很难让函数工作——我似乎只能得到每个字符串中第一个字符的返回值,而且只能使用相同的大小写。感谢你能给予的任何帮助 以下是迄今为止的代码: #include <stdio.h> #include <stdlib.h> int cmpstr
#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;
}
#包括
#包括
int cmpstr(常量字符*,常量字符*);
int main()
{
printf(“测试1:%d\n”,cmpstr(“你好”,“世界”);
printf(“测试2:%d\n”,cmpstr(“你好”,“你好”);
printf(“测试3:%d\n”,cmpstr(“世界”,“你好”);
返回0;
}
int cmpstr(常量字符*s1,常量字符*s2)
{
/*比较相应的字符串,直到达到null*/
而(*s1!='\0'&&&*s2!='\0')
{
如果(*s1<*s2)
{
返回-1;
}
否则,如果(*s1>*s2)
{
返回1;
}
其他的
{
返回0;
s1++;
s2++;
}
}
返回0;
}
删除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;
}
int-cmpstrMY(常量字符*s1,常量字符*s2)
{
字符sc1,sc2;
/*比较相应的字符串,直到达到null*/
而(1)
{
sc1=拖缆器(*s1);
sc2=拖缆器(*s2);
如果(sc1='\0'&&sc2=='\0'){
打破
}
否则如果(sc1='\0'&&sc2!='\0'){
返回-1;
}
否则如果(sc1!='\0'&&sc2=='\0'){
返回1;
}
否则如果(sc1sc2)
{
返回1;
}
其他的
{
s1++;
s2++;
}
}
返回0;
}
您的cmpstr必须与上面的代码类似。只需删除最后一个else部分,并将返回0放在循环外,因为只有当if part和if part不为真时,这两个字符串才相等,当它从循环中出来时,它将返回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;
}
int-cmpstr(常量字符*s1,常量字符*s2)
{
/*比较相应的字符串,直到达到null*/
而(*s1!='\0'&&&*s2!='\0')
{
如果(*s1<*s2)
{
返回-1;
}
否则,如果(*s1>*s2)
{
返回1;
}
s1++;
s2++;
}
返回0;
}
您的代码有一个非常明显的错误,即返回0
-语句生成s1++;s2++
转换为不可访问的代码(您的编译器应该警告您这一点)
但它也有一个概念上的错误,因为它忽略了s1
比s2
长的情况,反之亦然。因此,在您的方法中(一旦更正了返回0
-thing,“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;
}
int-cmpstr(常量字符*s1,常量字符*s2)
{
而(*s1&&*s2&&*s1==*s2){//向前移动,直到其中一个字符串结束或检测到第一个差异。
s1++;
s2++;
}
int结果=(*s1-*s2);
//如果两个字符串相等,则s1和s2已到达其端点,结果为0
//如果*s1>*s2,s1在词法上大于s2,结果为正
//如果*s1<*s2,则s1在词法上低于s2,结果为负值
//将“正”和“负”分别标准化为1和-1
如果(结果<0)
结果=-1;
否则,如果(结果>0)
结果=1;
返回结果;
}
strcmp不是选项吗?strcmp
确实是在按字典进行比较。不过,您可能希望将所有内容都转换为小写…从循环内部去掉返回0
。这没有意义,后面的代码是不可获取的(即死代码)。实际上,您总是在第一次迭代时返回,从不增加s1
或s2
,也从不查看多个字符。您还需要添加逻辑来处理字符串长度不相同的情况。将s1++;s2++;
移出该代码块。它们永远不会执行。@WeatherVane否,增量在哪里都很好。在它们之前的返回是个问题。Tom是对的,我朝这个方向修改了你的代码。Duygu-首先,谢谢你(和其他人)谢谢你的帮助。我只是想知道用tolower
代替towlower
是否可以?我不完全理解宽字符和窄字符之间的区别。你好,一些人!用“tolower”代替“towlower”可以吗,它不应该影响代码的工作方式。我使用它是因为习惯。宽字符增加了数据类型大小以存储更大的编码字符集。在本例中,不需要使用。Duygu-谢谢您,先生。Stephan Lechner-我尝试过修改您的代码以包含大写和小写字符,但我无法使其正常工作,我它只给出1的回报。我已经在我的帖子中编辑了代码。