注册 登录
编程论坛 C语言论坛

数组错误。

邹峰研 发布于 2020-03-24 16:21, 4560 次点击
#萌新求助# 对数组A中的N(0<N<100)个互不相同的整数从小到大进行连续编号,要求不能改变数组A中元素的顺序。如A=(78,42,-34,94,25)则输出为(4,3,1,5,2)。个数N和数组中元素要求从键盘输入。  为什么输出会有奇怪的运行错误啊,看不懂,,,。
错误原因可能是:
非法的内存引用, 具体原因可能是:
1.数组越界使用;
2.指针的错误使用, 一般是对非用户区的地址空间进行读或者写操作;
3.越权操作文件指针, 程序中却未捕捉该类错误;
4.栈溢出, 一般是因为过多的递归调用或者过大的临时变量导致;5.程序使用的内存超过了题目设定的上限。

#include <stdio.h>
#include <stdlib.h>

int shengxu(int *a,int n)
{
    int x,i,j;
    for(i=1;i<n;i++)
    {
        x = a[i];
        for(j=i;j>0;j--)
        {
            if(x<a[j-1])
            {
               a[j] = a[j-1];
            }else{
                break;
            }
        }
        a[j] = x;
    }
    return a;
}

int main()
{
    int *a;
    int A[100],s[100];
    int N,num,i,j,k;
    scanf("%d",&N);
    for(i=0;i<N;i++)
    {
        scanf("%d",&num);
        char c = getchar();
        A[i] = num;
        if(c=='\n')
            break;
    }
    for(i=0;i<N;i++)
        s[i] = A[i];
    a = shengxu(A,N);
    int count = N;
    for(j=0;j<N;j++)
    {
        for(k=0;k<N;k++)
        {
            if(s[j]==a[k])
            {
                count--;
                if(count==0)
                    printf("%d",k+1);
                else
                    printf("%d,",k+1);
            }
        }
    }
    return 0;
}
29 回复
#2
rjsp2020-03-24 16:31
编译失败,
int shengxu(int *a,int n) 应该是
int* shengxu(int *a,int n) 吧

还有,你输入什么后报运行错误?你不说别人怎么知道
#3
邹峰研2020-03-24 16:33
回复 2楼 rjsp
这个是上交的作业,系统给配的数据我也不知道,,,,我在自己的电脑上代入数据可以运行,所以感到很奇怪。我先把你的方法试试看。谢谢啦!
#4
邹峰研2020-03-24 16:36
回复 2楼 rjsp
可以了,谢谢你!

可以问下,为什么要加上‘*’吗?
#5
叶纤2020-03-24 16:55
下次我要从题目开始看,看会代码,感觉应该是个很复杂的题目,然后看了看题目。。。。
其实还有更简单的方法的,楼主想一想呀
#6
邹峰研2020-03-24 17:01
回复 5楼 叶纤
好的,我再想想看
#7
maomao123452020-03-24 17:47
我觉得用排序就行了
#8
叶纤2020-03-25 12:01
程序代码:
//如果想动态赋值数组就需要知道数组长度,把排序之前的地方改了就行
#include <stdio.h>
int main()
{
    int b[]={78,42,-34,94,25};//一个数组,就叫它蓝色桶桶
int z=0;
     int length=sizeof(b)/sizeof(*b);//数组长度
     int a[100];
      for(int i=0;i<length;++i)
     {
         a[i]=b[i];}//另复制一个相同的空间,黄色桶和蓝色桶装的一样的东西


     for(int i=0;i<length;++i)//拆入算法//将黄色桶里的东西排序
        {for(int j=i-1;j>=0&a[j]>a[j+1];--j)
        { int tem=a[j];
        a[j]  = a[j+1];
        a[j+1] =tem;
        }
        }
            for(int n=0;n!=length;++n)//比较蓝色桶的东西在黄色桶的哪个地方
            {
                for( z=0;z!=length;++z)
                {  if(b[n]==a[z])
                   printf("%d  ",z+1);

                }
           }
}



#9
return_02020-03-25 13:07
sort+cmp=无敌!!!
#10
叶纤2020-03-25 13:12
回复 10楼 return_0
请问sort是专门的排序函数吗
cmp是什么意思
#11
lin51616782020-03-25 20:08
以下是引用叶纤在2020-3-25 13:12:57的发言:

请问sort是专门的排序函数吗
cmp是什么意思

排序结果有升序 和 降序
sort是一个比较排序
决定升序降序是通过比较2个元素决定的
cmp是比较2个元素用的

提取主干 cmp用于决定是升序还是降序
#12
wmf20142020-03-25 21:12
cmp称为回调函数。
主程序调用sort,sort因为动态的需求又转身调用主程序的某个函数,这个函数就是回调函数。
为什么需要回调函数:因为很多需求是已经编译好的满足通用需求的库函数,这些代码是码农无法改变的,但库函数有时确实需要满足主程序个性要求的,于是库函数中提供一个函数指针参数,通过这个指针调用主程序的函数达到个性需求。具体到sort函数,就是通过cmp的返回值决定两两比较的数是否需要交换,表现到结果上就是排序数据是从大到小还是从小到大。
#13
xianfajushi2020-03-26 09:56
初学者可原谅的错误,简单的题目写,有些步骤是不需要的,使用指针无需返回,有返回无需指针.
从小到大进行连续编号,要求不能改变数组A中元素的顺序。如A=(78,42,-34,94,25)则输出为(4,3,1,5,2)=94 -34 78 25 42符合题目要求?
难道不是这样:-34 25 42 78 94=3 5 2 1 4 ?

[此贴子已经被作者于2020-3-26 09:57编辑过]

#14
lin51616782020-03-26 10:18
回复 13楼 xianfajushi
从接口设计的角度
返回指针和使用指针做参数没什么冲突
库函数许多接口就是这样设计的
比如 fgets strcpy
#15
wmf20142020-03-26 10:21
回复 13楼 xianfajushi
使用指针无需返回,有返回无需指针
大神能不能告诉我哪本书上说的?需不需要用指针、需不需要使用返回值,难道不是服从需求吗?比如我需要调用函数后参数值减少5倍,同时我还需要知道参数除以5的余数,难不成我必须写两个函数?
#16
xianfajushi2020-03-26 10:37
使用指针传递数组,数组内容是会被修改的,因此不需要返回数组,使用返回数组何必指针是同样道理,因为,已经达到目标了;
一个函数同时需要返回2个参数如你所说的,返回减少5倍及余数可使用数组或传递2个参数,因此,不需要写2个函数,就以你例举的可以这样写
void  aaa(int shu, int& shan, int& yu){...}调用 int a=111,shan=0,yu=0; aaa(a,shan,yu);这样就可以了,
还可以:void  aaa(int shu, int* jieg){...}调用 int a=111,jieg[2]{0}; aaa(a,jieg);这样就可以了.
关键是达到目的,何必滥用?
以下是引用wmf2014在2020-3-26 10:21:13的发言:
使用指针无需返回,有返回无需指针
大神能不能告诉我哪本书上说的?需不需要用指针、需不需要使用返回值,难道不是服从需求吗?比如我需要调用函数后参数值减少5倍,同时我还需要知道参数除以5的余数,难不成我必须写两个函数?

#17
lin51616782020-03-26 10:41
以下是引用xianfajushi在2020-3-26 10:37:03的发言:

使用指针传递数组,数组内容是会被修改的,因此不需要返回数组,使用返回数组何必指针是同样道理,因为,已经达到目标了;
一个函数同时需要返回2个参数如你所说的,返回减少5倍及余数可使用数组或传递2个参数,因此,不需要写2个函数,就以你例举的可以这样写
void  aaa(int shu, int& shan, int& yu){...}调用 int a=111,shan=0,yu=0; aaa(a,shan,yu);这样就可以了,
还可以:void  aaa(int shu, int* jieg){...}调用 int a=111,jieg[2]{0}; aaa(a,jieg);这样就可以了.
关键是达到目的,何必滥用?

不是你说滥用就是滥用了
参数是指针 同时返回值是指针
可以发挥其他作用
比如 检查函数调用是否成功
while(fgets(str, sizeof str, fp) != NULL)
{

}

比如 直接作为其他操作的参数
strcmp(strcat(str, strsrc), "password");
puts(strcpy(str, strsrc));



[此贴子已经被作者于2020-3-26 10:44编辑过]

#18
xianfajushi2020-03-26 10:45
用一个示例来说明void 数组右移(int* a, int aa, int aaa)
只有本站会员才能查看附件,请 登录

可以看到12被移动了4个位置,说明数组内容被修改了,因此,无需写返回函数。
#19
wmf20142020-03-26 10:49
回复 16楼 xianfajushi
口&&可...口&&可...
我还觉得你滥用参数、滥用指针呢。
#20
lin51616782020-03-26 10:58
回复 20楼 xianfajushi
fgets strcpy 这样的函数 没有滥用指针 你可以说是滥用指针
那么 你自己写的函数没有滥用指针 别人也可以说你滥用指针呗
不就是 随口胡说 谁不会?
#21
xianfajushi2020-03-26 10:58
回复 19楼 wmf2014
就以我的数组右移函数举证来看看,请指出我这样函数哪里滥用。
#22
lin51616782020-03-26 11:03
回复 21楼 xianfajushi
你说 同时使用指针返回值和指针参数是滥用指针
也请你指出
char *fgets( char *str, int count, FILE *stream );
这样的接口 哪里滥用指针了?
#23
xianfajushi2020-03-26 11:03
说初学有些步骤是多余的指for(i=0;i<N;i++)        s[i] = A[i];按题目要求无需这样,另一个数组只是填写从小到大的下标,与原数组内容毫无相干。
就如同前次回复另一贴一样,分析给他听重复的地方是不需要的道理一样。
初学者有时不明白自己是在做些虾米,因此,是可以理解的,也是需要解释的。

[此贴子已经被作者于2020-3-26 11:15编辑过]

#24
forever742020-03-26 12:01
看来你们认识到了,你们实际上不在同一个频道。
条条大路通庐山,可是不同的路上横看成岭侧成峰。
#25
lin51616782020-03-26 12:09
以下是引用forever74在2020-3-26 12:01:36的发言:

看来你们认识到了,你们实际上不在同一个频道。
条条大路通庐山,可是不同的路上横看成岭侧成峰。

在不在一个频道不重要
我能不能理解他 他能不能理解我不重要
这是论坛  在这里展示出不同观点
其他浏览论坛的人看到了 如果能有所收获
就是一件好事
#26
叶纤2020-03-26 12:59
了解了

[此贴子已经被作者于2020-4-1 22:35编辑过]

#27
return_02020-03-26 13:47
回复 8楼 叶纤
sort是c++ #include<algorithm>里面的排序函数
#28
return_02020-03-26 13:48
cmp是和sort配合使用的自定义函数
#29
return_02020-03-26 13:49
cmp用于自定义排序
#30
邹峰研2020-04-01 21:45
回复 8楼 叶纤
谢谢啦
1