我编写了这段代码,该代码假定按照某些规则对字符串进行排序,小写字母首先从z开始,然后从AZ开始使用大写字母,但是它没有按我预期的那样工作。(我知道问题来自should_be_swapped函数,但我不明白为什么它不起作用。)它所要做的就是将字符串“ DBCAdbca”更改为新的字符串“ abcdABCD”。
#include <stdio.h>
int should_be_swapped(char ch1,char ch2);
void swap_chars(char* ch1, char* ch2);
int sort_string(char* str);
int main()
{
char a[]="DCBAdcba";
if (sort_string(a))
{
printf("Sorted String: %s\n", a);
}
else
{
printf("The original String was already sorted.\n");
}
return 0;
}
int should_be_swapped(char ch1,char ch2)
{
if (ch1<ch2)
{
return 1;
}
if (ch1>ch2 && ch1<='z'&& ch1>='a' && ch2<='z'&&ch2>='a')
{
return 1;
}
if (ch1>ch2 && ch1<='Z'&& ch1>='A' && ch2<='Z'&&ch2>='A')
{
return 1;
}
else {
return 0;
}
}
void swap_chars(char* ch1, char* ch2)
{
char tmp;
tmp = *ch1;
*ch1 = *ch2;
*ch2 = tmp;
}
int sort_string(char* str)
{
int i,j,count=0;
for (j=0;str[j]!='\0';j++)
{
for (i=0;(str[i])!='\0';i++)
{
if (should_be_swapped(str[i],str[i+1]) )
{
swap_chars(&str[i],&str[i+1]);
count++;
}
}
}
if (count>0)
{
return 1;
}
else {
return 0;
}
}
有什么建议?
这是我的解决方案。它首先检查值是否在违规范围内,并进行修正,如果值在z之内,则将其转换为AZ,反之亦然。然后,它使用单个if语句比较新值,但是旧值被交换。
int should_be_swapped(char ch1,char ch2)
{
const char cn1 = ( ch1<='z'&& ch1>='a' ) ? ch1 - ( 'A' - 'a' ) : ch1 ;
const char c1 = ( ch1<='Z'&& ch1>='A' ) ? ch1 + ( 'A' - 'a' ) : cn1 ;
const char cn2 = ( ch2<='z'&& ch2>='a' ) ? ch2 - ( 'A' - 'a' ) : ch2 ;
const char c2 = ( ch2<='Z'&& ch2>='A' ) ? ch2 + ( 'A' - 'a' ) : cn2 ;
if( c1 > c2 )
{
return 1 ;
}
return 0 ;
}
在您的代码中使用此函数将提供正确的结果:abcdABCD
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句