c-使多个数移位输出,应用指针时出错,求解

问题描述

使多个数移位输出,应用指针时出错,求解

要达到的目的是输入n = 5, a = {1,2,3,4,5},m = 3时能输出 4 5 1 2 3
可在对指针所指的值赋值时出错,是语法问题吗?代码见下:

/*移位m个整数*/
#include <stdio.h>
#include <stdlib.h>
int* a = 0, *a1 = 0;
int* move(int* a,int n,int m);
int main()
{
    int n;
    printf("Please input the size: ");
    scanf("%d",&n);
    //为数组动态分配大小
    if (!(a = (int* )calloc(n,sizeof(int))))
    {
        printf("Fail to allocate memory!!!n");
        exit(1);
    }
    printf("Please input %d numbers: ",n);
    for (int i = 0; i < n; i++)
        scanf("%d",a + i);
    int m;
    printf("Please input m: ");
    scanf("%d",&m);
    a1 = move(a,n,m);
    //输出新排列
    for (int j = 0; j < n; j++)
        printf("%6d",a1 + j);
    system("pause");
    return 0;
}

int* move(int* a, int n,int m)
{
    for (int i = m; i < n; i++)
    {
        *(a1 + i -m) = *(a + i);  // 编译时这里内存报错,但不知为什么错,怎么改
    }
    for (int j = 0; j < m; j++)
    {
        *(a1 + n + j) = *(a + j);
    }
    return a1;
}

解决方案

其实写一个倒序数组的函数,递归三次就可以,1、2、3、4、5,输入是3,输出结果为4、5、1、2、3。第一次倒序1、2、3,第二次倒序4、5,这两次倒序的结果是3、2、1、5、4,然后再倒序一次就可以得到4、5、1、2、3,所以真正需要写的函数就只有一个倒序数组的函数,百度一个,很easy

解决方案二:

  *(a1 + i -m) = *(a + i);  // 编译时这里内存报错,但不知为什么错,怎么改

    错误原因:a1指向的空间是非法的,你应该在main函数中和a一样也申请n个元素空间,存放变化后的数组。

解决方案三:

a1 没开辟数组空间,它仅是一个指针!会出问题!

解决方案四:

你的程序还有其他错误:

 printf("%6d",a1 + j);//应该:printf("%6d",*(a1 + j));
 申请的空间没有释放

你的这个编程算法也比较麻烦,如果仅仅是实现输出,只要控制下标就可以了。例如:

    //输出新排列
    for (int j = m; j < n; j++)
        printf("%6d",a[j]);
    for (int j = 0; j < m; j++)
        printf("%6d",a[j]);

解决方案五:

//参数:数组a,倒序开始的位置begin,结束的位置end
void swap(int *a,int begin,int end)
{
//p指向倒序的开始位置
int *p = a+begin;
//q指向倒序的结束位置
int *q = a+end;
int temp;
//只要p在q的左侧,就一直交换p和q所指向的数组元素,交换一次后,p向右移动一位,q向左移动一位
for(;p<q;p++,q--)
{
temp = *p;
*p = *q;
*q = temp;
}
}
所以你在main函数中调用的时候分别调用三次
sawp(a,0,n);//交换1,2,3
swap(a,m,n-1);交换4,5
swap(a,0,n-1);交换3,2,1,5,4

解决方案六:

a1是什么东西?写错了吧?

时间: 2024-09-13 21:51:21

c-使多个数移位输出,应用指针时出错,求解的相关文章

using-输入10个整数,将其中最小的数与第一个数交换,把最大的数与最后一个数交换。用指针实现,但是程序崩溃了

问题描述 输入10个整数,将其中最小的数与第一个数交换,把最大的数与最后一个数交换.用指针实现,但是程序崩溃了 #include #include /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main() { int a[10],i, p, *q, *n; printf("请输入十个数n"); for

c语言-[C语言]求一个算法,输入N个数,输出所有其中任意M个数相加等于定值S的结果

问题描述 [C语言]求一个算法,输入N个数,输出所有其中任意M个数相加等于定值S的结果 如题,比如输入1,,2,10,5,7,8,9,11,输出其中任意几个数相加等于12的结果(不重复), 不自身相加. 1+2+9=12 10+2=12 7+5=12 解决方案 这题如果不考虑优化问题--轮询吧--总共有2的n次方种组合-学过排列组合的都知道

debug-C++ 如何LOG输出父类指针调用的是哪个子类的方法

问题描述 C++ 如何LOG输出父类指针调用的是哪个子类的方法 项目不能debug调试,只能打LOG. 其中有一个父类类型的指针调用虚函数_pFather->Start(); 我想用Log输出该指针指向哪个子类类型,也就是想确认调用的是哪个子类的Start(). 子类有好几十个,并且我不会在每个子类的方法中都加上Log日志吧!!! 请问有没有什么好方法.

编程语言-c#实现两个相差一千位以内的整数相加,写出这样一个方法并测试两个相差一百位以上的两个数,输出结果。

问题描述 c#实现两个相差一千位以内的整数相加,写出这样一个方法并测试两个相差一百位以上的两个数,输出结果. (如:111111111111111111111111111110 + 8 ) 解决方案 如果是.NET 4.0(VS2010),不需要写什么方法,直接调用BigIntegerhttps://msdn.microsoft.com/zh-cn/library/system.numerics.biginteger.aspx 解决方案二: 2000位的整数也不在话下,加减乘除都能做.

c语言-C中对排序好了后的数组中插入一个数在输出

问题描述 C中对排序好了后的数组中插入一个数在输出 用冒泡排序法对输入的20个数进行降序排序存入数组中,然后在输入一个数插入到该数组,要求保持原序不变输出该数组的21个数! 解决方案 int main(void) { int i,j,array[20],temp; printf("Input 20 integer:"); /*输入20个整数*/ for(i=0;i<20;i++) scanf("%d",&array[i]); printf("

输入m个数,输出其中最小的n个。用java中的队列(Queue)或堆栈(Stack)实现。

问题描述 输入m个数,输出其中最小的n个.用java中的队列(Queue)或堆栈(Stack)实现.

c语言-为什么输入第一个数时要输入2个数才输出“第二个数”

问题描述 为什么输入第一个数时要输入2个数才输出"第二个数" #include #include struct LinkList { int data; struct LinkList *next; }; struct LinkList *Creat() { struct LinkList *H=NULL,*p,*q; int x,j; for(j=1;j { printf("请输入第%d个数: ",j); printf(" n"); p=(st

chrome-console.log 输出 JQuery对象时,

问题描述 console.log 输出 JQuery对象时, 向看看它的结构. 第一个 输出貌似只是把 类型输出了.第二个可以输出 树状的结构.这是怎么回事啊?? 解决方案 写成2句,合成依据没有办法,打印的是字符串了,而不是dom对象 解决方案二: 我认为是第一行代码是字符串的'+'运算,由于隐式类型转换的存在,会自动对$(vHtml)调用toString()方法,得到'[object object]'

关于C语言二重指针的疑惑求解

问题描述 关于C语言二重指针的疑惑求解 程序如下,十分简短: #include void main(){ int a[3][4]={{1,2,3,4},{10,20,30,40},{100,200,300,400}}; printf("&a==%d ",&a); printf("a==%d ",a); printf("&a[0]%d ",&a[0]); printf("a[0]==%d ",a[