C语言问题:将一字符串按ASCII大小排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言问题:将一字符串按ASCII大小排序相关的知识,希望对你有一定的参考价值。

main()

char a[260] ;
int i,j,k;
printf("please enter:");
gets(a);
for(i=0;a[0]!='\0'; )

for(j=0

;a[j]!='\0';j++)

if(a[i]>a[j]) i=j;

printf("%c",a[i]);
for(k=i;a[k]!='\0';k++) a[k]=a[k+1];


getch();


为什么当我输入的字符串的最后一个是最大的时候程序运行正常 但是最后一个不是字符串中的最大的就会出现死循环???
如hasdhsdkfhdz对的 但是sjaoidjiaosdjsdozkokp不对
谢谢
就是输入一个字符串 再将字符串按ascii值大小排序

出现死循环时,屏幕上输出的其实是'\0'(和空格一个效果),因为最后一个不是字符串中的最大的时候,随着程序执行,字符串中字符不断减少,最后一个字符终将变为字符串中最小的字符,此后执行if(a[i]>a[j]) i=j;后a[i]='\0',随后再次循环到if(a[i]>a[j]) 时,因为a[i]='\0',所以就总会小于a[j],于是保持a[i]='\0',输出屏幕上就是空,而a[k]=='\0',字符串不会再变化,并陷入死循环。
把for(i=0;a[0]!='\0'; )改为for(i=0;a[0]!='\0';i=0 )就好了。
(好吧,我很啰嗦,希望讲清楚了~)
参考技术A 1.
字符a和'a'的区别是什么,

a是个变量

'a'是一个字符
2.
字符加单引号和不加单引号的区别是什么,

有单引号是字符常量,没有,只能是个变量符号
3.
'a-a'是代表什么

这么写是错的,可以写成a-'a'

这表示得到a在字母中的序号,如a='a'
则,a-'a'=0
参考技术B 没看懂你想干什么

字符串数组排序(C语言)(qsort库函数)

for(i=1;i<=n;i++)

scanf("%s",f[i]);

怎么使用库函数qsort对F[I]进行排序?要求长度短的在前,长度相同的以首字符排序(字符串中只存在0~9十个数字)

声明一个字符串指针数组存放每个字符串的首地址,调用库函数qusort按题目要求对字符串指针排序,不移动源字符串。关键是要设计一个好的比较函数,精巧地解决“按长度、长度相等时按大小”排序的问题。举例代码如下:

//#include "stdafx.h"//If the vc++6.0, with this line.
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define N 10 //字符串个数
#define LN 21 //限制字符串长度为20
int mycmp(const void *a,const void *b)//比较函数
char *pa=*(char **)a,*pb=*(char **)b;
int x=int(strlen(pa)-strlen(pb));//依长度比较
return x ? x : strcmp(pa,pb);//长度相等时依大小比较

int main(void)
int i=0,j=0;
char *f[N],w[LN*N];//声明指针数组f和字符串总空间
printf("Input %d string(s)(length<=%d)...\\n",N,LN);
while(i<N)//输入并将字符串首址赋给f[i]
if(scanf(" %[1234567890]",f[i]=w+j)>0 && strlen(f[i])<LN)
i++,j+=LN;
    else printf("Error, redo: Required length less than %d:",LN);

qsort(f,N,sizeof(char *),mycmp);//调用库函数对字符串指针排序
for(i=0;i<N;printf("%s\\n",f[i++]));//输出...
return 0;

参考技术A qsort是通过你自己的比较函数进行排序,也就是说你必须自己写比较函数,两个字符窜的比较,然后按照qsort的格式填进去,调用函数快速排序就可以了。假设width为每个字符串长度,compare_fun为比较函数,则:qsort(&f[0],10,width,compare_fun);
但是qsort函数的定义:void qsort(
void *base,
size_t num,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
第三个参数是每个元素的长度,对于不是定长的字符串是无法比较的(好像是这样的,变长的我没有试过。。你也可以试一试用sizeof)。所以最多能够进行等长的字符串比较。相信比较函数楼主能够自己完成。
参考技术B #include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 5
#define SIZE 100

int cmpOne(const void *a, const void *b)

char *p = (char *)a;
char *q = (char *)b;
int m = strlen(p);
int n = strlen(q);

if (m != n)

return (m - n);//按串长排序,由小到大

else

return (*p - *q);//按首字母排序,由小到大



void main(void)

int i;
char str[SIZE][SIZE];

for (i=0; i<N; i++)

scanf("%s", str[i]);


qsort(str, N, SIZE, cmpOne);

for (i=0; i<N; i++)

puts(str[i]);

printf("\n");
参考技术C 假设一个字符串最大长度100
qsort(f,n,sizeof(char)*100,comp);   
int comp(const void *a,const void *b )   

if(strlen((char*)a)<strlen((char*)b))
return 1;
else if(strlen((char*)a)==strlen((char*)b))
return strcmp((char*)a,(char*)b));
else
return 0;     

//没经过验证
参考技术D 新鲜出炉:
#include "stdio.h"
#include "string.h"
#include <stdlib.h>

#define N 5 /*字符串个数*/
#define MAXLEN 30 /*字符串最大长度*/
int CompareStrLen( const void * s1, const void * s2)

char * r1, * r2;

r1 = (char *)s1;
r2 = (char *)s2;
/*比较字符串长度*/
if (strlen(r1)>strlen(r2))

return 1;

else if (strlen(r1) < strlen(r2))

return -1;

else
return 0;



int CompareHeaderChar(const void * s1, const void * s2)


char * r1, * r2;

r1 = (char *)s1;
r2 = (char *)s2;
//比较首字母
if (*r1 > *r2)

return 1;

else if ( *r1 < *r2)

return -1;

else
return 0;


int main()

const int n=N;
char f[n][MAXLEN];

int k=0, numOfSamelength=1;
/*输入*/
for(int i=0;i<n;i++)

printf("输入一串数字:");
scanf("%s",f[i]);


/*根据字串长度排序*/
qsort((void *)f, n, sizeof(char [MAXLEN]), CompareStrLen);
printf("\n按照长度排序的结果:\n");
for(i=0;i<n;i++)

printf("输出:");
printf("%s\n",f[i]);


/*相同长度,根据首字母排序*/
do

while( (k<n-1) && (strlen(f[k]) == strlen(f[k+1])))/*计算相邻具有相同长度的字串的个数*/

numOfSamelength ++;
k++;


/*把字符串数组按照相同长度的一段,根据首字符进行排序*/
qsort((void *)(f+k-numOfSamelength+1), numOfSamelength, sizeof(char [MAXLEN]), CompareHeaderChar);

/*下一段开始,初始化计数器*/
numOfSamelength=1;
k++; /*下一段字符串对应的下标*/
while (k<n);

printf("\n长度相同字符串按首字符排序的结果:\n");
for(i=0;i<n;i++)

printf("输出:");
printf("%s\n",f[i]);

return 0;

/* 运行结果:
输入一串数字:1
输入一串数字:8
输入一串数字:28456
输入一串数字:52
输入一串数字:25

按照长度排序的结果:
输出:8
输出:1
输出:52
输出:25
输出:28456

长度相同字符串按首字符排序的结果:
输出:1
输出:8
输出:25
输出:52
输出:28456

*/本回答被提问者和网友采纳

以上是关于C语言问题:将一字符串按ASCII大小排序的主要内容,如果未能解决你的问题,请参考以下文章

C语言中字符串排序的原理是啥

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

C语言问题:输入一行字符串,然后按照ASCII码大小进行升序排序。

如何用C语言编程将字符串s中的所有字符按ASCII值从小到大重新排序后输出字符串?

如何用C语言编程将字符串s中的所有字符按ASCII值从小到大重新排序后输出字符串?

求c语言高手,ASCII码排序