按照ASCII码升序排序问题,我哪里不对呀?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按照ASCII码升序排序问题,我哪里不对呀?相关的知识,希望对你有一定的参考价值。

#include<conio.h>
#include<stdio.h>
#include<string.h>
void fun(char t[])

char c;
int i,j;
for(i=strlen(t);--i;i--)

for(j=i-1;j<=0;j--)
if(t[i]<t[j])

c=t[j];
t[j]=t[i];
t[i]=c;



void main()

char s[81];
printf("\nPlease enter a character string:");
gets(s);
printf("\nBefore sorting :\n%s",s);
fun(s);
printf("\nAfter sorting decending :\n %s\n",s);

语法没错,逻辑很有问题
for(i=strlen(t);--i;i--)
//--i和i--的区别是什么,取临界节点,当i=0的时候,--i是先把i-1再判断是否为0,结果i变负数了。
而且这么写实际一次循环里i被减了两次,修改:--i改为i

for(j=i-1;j<=0;j--)
if(t[i]<t[j])
//t[i]中的i是strlen(t),假设s[81]数组存了80个字符,那么第81个就是结束符NUL,而用下表表示就是
t[80],而strlen(s)就是80,说明什么?char在有些电脑是有符号的 (signed char),如果为负,那么
将交换结束符的位置,这个将导致字符串结果未定性.修改:i=strlen(t)-1,这又会有一个新问题,如果strlen(t)一开始就是0呢,我们必须避免这个问题,在循环前加:
if (!stlen(t)) printf ("string is empty");return;

c=t[j];
t[j]=t[i];
t[i]=c;
参考技术A 建议这样改一下子程序,以后用这样格式写就简单、不容易出错了:
void fun(char t[])
char c; int i,j,k;
k=strlen(t);
for ( i=0;i<k-1;i++ ) //记忆排序程序时外重循环起始值0,结束值是整个长度减1
for ( j=i+1;j<k;j++ ) //内重循环起始值是外重循环变量加1,结束值是整个长度
if ( t[i]>t[j] ) //循环内根据条件交换两个元素,如果大于交换则升序小于降序
c=t[i]; t[i]=t[j]; t[j]=c;
追问

我的错哪里了呢?明明逻辑上行得通呀?你这个我试了,是没问题,能帮我指出我的到底错哪了吗?

追答

先说两点:

-首先你的外循环for ( i=strlen(t);--i;i-- )没有结束循环的条件,这个循环如何结束,需要加上个条件
-如果i=strlen(t),假设字符串长度是10个字符,你的i的起始值是10,而字符串数组中10个字符是t[0]~t[9],如果用t[i],当i=10时会越界了。

追问

我用的是vc++6.0,允许这么写循环条件的
for(i=strlen(t)-1;i;i--)

for(j=i-1;j>=0;j--)
if(t[i]=0这样写就没问题了,刚才同学告诉我的,不过谢谢你了

本回答被提问者采纳
参考技术B 首先 for语句中间的--i改成一个条件句追问

写成这样,不是默认i大于0的话就执行的吗?

追答

谁告诉你的,照脸抽他,我刚刚特意测试了一下= = 死循环

追问

那你能不能帮我改一改,是这个程序能完成功能?整体的思路别改,把我不对的改一下,谢谢

追答

#include
#include
#include
void fun(char t[],int n)

char c;
int j,k;
for(j=0;j=j;k--)
if(t[k]<t[j])

c=t[k];
t[k]=t[j];
t[j]=c;


printf("\nAfter sorting decending :\n %s\n",t);

int main()

char s[81];
printf("\nPlease enter a character string:");
gets(s);
printf("\nBefore sorting :\n%s",s);
int p=strlen(s);
fun(s,p);


你源代码错的太多不忍直视 已经尽量少改了
最大的一个错误就是要在外部输出函数内改变的字符串等 要传递指针变量 要不然就在函数内输出 像我这样

追问

for(i=strlen(t)-1;i;i--)

for(j=i-1;j>=0;j--)
if(t[i]<t[j])

c=t[j];
t[j]=t[i];
t[i]=c;

我同学刚告诉我的,这样就行了

追答

逗 你看看输出

参考技术C 这是神一样的人教你的啊,for循环能写成那样啊追问

那要怎么改呀,能帮我改一下吗?

追答

不能

怎样让字符串按ASCII码排序

在你需要的地方调用如下过程,如:string newString = mysort(参数)

private string mysort(string str)

if(str.Length !=7)

MessageBox.Show("字符串长度不等于 7 !","错误");
return "";

string mystr = str.Substring(1, 5); //去首尾字符
char[] myCharArray = mystr.ToCharArray(); //转为字符数组
Array.Sort(myCharArray); //升序排序
Array.Reverse(myCharArray); //反转
string new_str = new String(myCharArray); //转为字符串
//加首尾字符
string ret_str = str.Substring(0, 1) + new_str + str.Substring(6, 1);
return ret_str; //返回

本回答由提
参考技术A ASCII码采用7位二进制比特编码,可以表示128个字符。最小的ASCII码是0000000(二进制),最大的是1111111(二进制)。

以上是关于按照ASCII码升序排序问题,我哪里不对呀?的主要内容,如果未能解决你的问题,请参考以下文章

待签名参数按照字段名的ascii码从小到大排序 怎么理解

待签名参数按照字段名的ascii码从小到大排序 怎么理解

ACM-ASCII码排序

求c语言高手,ASCII码排序

SqlSever基础 oder asc 排序,给数据库中的表按照指定的列中内容进行升序排列

sql 升序降序排列