调试修改程序,将5个字符串从小到大排序后输出(源程序有错)

调试修改程序,将5个字符串从小到大排序后输出(源程序有错),第1张

#include <stdio.h>

#include <string.h>

void fsort(char cname[][6],int n)

{

    int k,j

    char temp[6]

    /*

    for(k=0k<nk++)

    for(j=0j<n-kj++)

    if(cname[j]>cname[j+1])

    {

        temp=cname[j]

        cname[j]=cname[j+1]

        cname[j+1]=temp

    }

    */

    for(j=0j<n-1j++) //这里是j<n-1

        if(strcmp(cname[j],cname[j+1]) > 0)

        {

            strcpy(temp,cname[j])

            strcpy(cname[j],cname[j+1])

            strcpy(cname[j+1],temp)

        }

}

void main()

{

    int i

    char cname[5][6]={"Wang","Li","Zhang","Jin","Xian"}

    fsort(cname,5)

    for(i=0i<5i++)

        printf("%s\n",cname[i])

}

我修改了你的程序,可以正确运行,你可以试一试哦,望采纳。

你要明白,指针变量有两个相关的值,一个是指针变量本身的内存地址,一个是该内存地址存储的数据,是另一个变量的地址。

如:

int *p//定义一个指针变量,既然是变量,它本身就有地址,还没赋值,它里面的数据不确定。

所以*p=5是错误的,还没初始化,指向的内存地址不确定,要把5存储到哪里的内存?

指针变量名p表示的是它的值,等于另一个变量的地址。

int a

p=&a//将a变量的地址存储在 p变量所在的内存空间。

char *pname[]={"wang","li","zhang","jin","xian"}这里定义的是一个指针数组,数组的元素是一个个字符串的地址,假设是{0xaa,0xbb,0xcc,0xdd}

将数组首地址作为实参传递给形参

在调用函数里面,因为是地址传递,所以可以改变数组元素的顺序,如假设变为{0xbb,0xcc,0xaa,0xdd}

形参改变不会影响实参的值没错,pname本身的值也的确没变,但是数组元素的顺序改变了,指向的字符串当然也不同了。

如果还是不懂就画个草图,关键是 时刻把数据在内存中的存储放在心上。

你的第一个程序没有实现交换的原因是你的涵数的功能其实是把两个指针的值进行了交换,它们所指的内存空间的内容是没有改变的,所以说变量a和b的值没有改变,而第二个程序中由于把数组的指针传递过去,这样再对其所指的内容进行 *** 作其实就是对原来指针指向的内容进行 *** 作,当然能把以前的内容改变了。至于你说的形参不改变的问题,那只是在传递的是值的过程中,形参由于是临时分配的,所以当返回主函数后就释放了,所以不会改变,但传递的地址就不一样了,因为对这个地址所指的内存的 *** 作是实实在在的,所以会使其发生改变。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7909788.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存