Made in heaven!! 2022-01-19 11:14 采纳率: 80%
浏览 18
已结题

如何用二维数组、数组指针进行选择法排序。为何是无法修改的左值?怎么改?

#include <stdio.h >
#include <string.h>
void main ()
{
char arr[][10]={"America","England","Chian","Japan","France"},tmp=NULL;
char (ptr)[10]=arr;
short i,j,k;
printf("排序前:");
for(i=0;i<5;i++,ptr++)
printf("%s\n",*ptr);
for(i=0;i<4;i++)
{
k=i;
for(j=i+1;j<5;j++)
if(strcmp(*(ptr+i),*(ptr+j))>0)
k=j;
if(k!=i)
{
strcpy(tmp,
(ptr+i));
strcpy(
(ptr+i),(ptr+k));
strcpy(
(ptr+k),tmp);
}
}
for(i=0;i<5;i++,ptr++)
printf("%s\n",*ptr);
getch();
}

  • 写回答

2条回答 默认 最新

  • 关注

    代码丢失了很多星号,不知道到底有多少错误,明显的基础错误如下:
    (1)temp没有申请空间
    (2)排序前,需要把ptr重置一下,排序时,内层for循环的if语句 if(strcmp( *(ptr+i), *(ptr+j))>0)这里不应该用 ptr+i,而是ptr+k,每次比较应该是与当前最小值比较,而不是跟 ptr+i比较。
    (3)最后输出的时候,需要把ptr重新赋值一下
    代码贴在下面,修改的部分在代码中有注释。
    运行结果:

    img

    代码修改如下:

    #include <stdio.h >
    #include <string.h>
    void main ()
    {
        char arr[][10]={"America","England","Chian","Japan","France"},tmp[10];//修改1 给tmp一块内存空间
        char (*ptr)[10]=arr;
        short i,j,k;
    
        printf("排序前:");
    
        for(i=0;i<5;i++,*ptr++)
            printf("%s\n",*ptr);
    
        ptr = arr; //修改2 重置ptr
        for(i=0;i<4;i++)
        {
            k=i;
            for(j=i+1;j<5;j++)
            {
                if(strcmp(*(ptr+k),*(ptr+j))>0) //修改3 ptr+i改成 ptr+k,每次都是跟当前最小值进行比较
                    k=j;
            }
            if(k!=i)
            {
                strcpy(tmp,*(ptr+i));
                strcpy(*(ptr+i),*(ptr+k));
                strcpy(*(ptr+k),tmp);
            }
        }
    
        ptr = arr; //修改4 重置ptr
        for(i=0;i<5;i++,ptr++)
            printf("%s\n",*ptr);
        getchar();
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月28日
  • 已采纳回答 1月20日
  • 创建了问题 1月19日

悬赏问题

  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含
  • ¥15 麒麟V10桌面版SP1如何配置bonding