我制作了这个代码,假设按照一些规则对字符串进行排序,小字母首先来自a-z,大写字母后来来自A-Z,但它不能像我预期的那样工作。 (我知道问题来自于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;
}
}
有什么建议吗?
答案 0 :(得分:0)
int should_be_swapped(char ch1, char ch2)
{
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;
}
if (ch1>ch2 && ch1 <= 'Z'&& ch1 >= 'A' && ch2 <= 'Z'&&ch2 >= 'A')
{
return 1;
}
else { return 0; }
}
您没有考虑到CAPS的ascii值低于小写。这似乎产生了预期的结果。
答案 1 :(得分:0)
你的意思是这样做吗?
int should_be_swapped(char ch1,char ch2){
if (ch1<='Z' && ch1>='A' && ch2<='z' && ch2>='a'){
return 1;
}else if (ch1<='z' && ch1>='a' && ch2<='Z' && ch2>='A'){
return 0;
}else if (ch1>ch2){
return 1;
}else{
return 0;
}
}
答案 2 :(得分:0)
我将假设您可以使用大于对char类型的检查,并且还假设问题是您得到的答案看起来像ABCDabcd而不是abcdABCD。对于ASCII字符,它们被计算机称为整数,即'a'是97而'A'是65,所以当你问计算机是'a'时,它是'答案'答案是否定的,因为它正在比较它与每个字符关联的整数值,而不是它们的字母顺序。
尝试使用此表(http://www.asciitable.com/)并在比较时将字符视为整数。
答案 3 :(得分:0)
这是我的解决方案。它首先检查值是否在违规范围内并修复它们,如果值在a-z内,它将转换为A-Z,反之亦然。然后,它使用单个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