int main()
{
unsigned char i=0,j=0,p=0,tmp=0,max=0;
char *Asid;
scanf("%s",Asid);
p=strlen(Asid);
//for(i=0;i<p;i++)Asid[i]-=0x30; //ascii处理为数字
//输入完成,开始冒泡排序,从大到小
for(j=0;j<p;j++){
tmp=Asid[j];
max=j;
for(i=j;i<p;i++){
if(tmp<Asid[i]){
max=i;
tmp=Asid[i];
}
}
tmp=Asid[j];
Asid[j]=Asid[max];
Asid[max]=tmp;
printf("%c",Asid[j]);
}
return 0;
}
Asid 是一个 char 类型的指针,但没有指向有效的地址空间。要使用字符数组作为输入缓冲区。
strlen(Asid) 的结果是个无符号整型,存放起来可能会有问题,可以使用 int。但是这里先不改,还有后面的问题需要先处理。
在输出字符的时候打印了排序中的每一步结果,显然不是题目所要求的输出形式,应考虑在将数组排序后再输出。
以及代码没有考虑到数据溢出、数组越界问题,如果输入过长或则过短,或者出现非法字符,程序就会崩溃。在编写 C 语言程序时,要对输入的数据进行合法性检测,这里使用 scanf 函数就可以检测出错误。
修改及注释见下,希望对您能有帮助:
#include <stdio.h>
#include <string.h>
#define N 256
int main() {
char Asid[N]; // 字符数组
int Asid_int[N]; // 数字数组
int len; // 字符串的长度
while (~scanf("%s", Asid)) { // 如果输入有效
len = strlen(Asid);
for (int i = 0; i < len; i++) {
if (Asid[i] < '0' || Asid[i] > '9') { // 只允许输入数字
printf("输入有误\n");
return 0;
}
Asid_int[i] = Asid[i] - '0'; // 处理为数字
}
for (int i = len - 1; i >= 1; i--) // 从大到小冒泡排序
for (int j = 0; j < i; j++)
if (Asid_int[j] < Asid_int[j + 1]) {
int tmp = Asid_int[j];
Asid_int[j] = Asid_int[j + 1];
Asid_int[j + 1] = tmp;
}
for (int i = 0; i < len - 1; i++)
printf("%d ", Asid_int[i]); // 分隔符是空格
printf("%d\n", Asid_int[len - 1]); // 最后一个数字后面不需要空格
}
return 0;
}