关于#c语言#的问题,请各位专家解答!

img


怎么做啊,求指点,什么是起泡算法排列,从大到小输出。不知道对不对求改进

img


#include <stdio.h>

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;
}