#include<stdio.h>
main()
{void sert(int *,int,int);
 int n=10,i,m,a[10],*p;
 p=a;
 printf("please input m=\n");
 scanf("m=%d",&m);
 printf("\nplease input 10 data\n");
 for(i=0;i<n;i++)
   scanf("%d",p+i);
 sert(p,m,n);
 for(i=0;i<n;i++)
  printf("%d,",*(p+i));
}
void sert(int *o,int m,int n)
{int j,q;
  for(j=0;j<m;j++)
  {
   q=*(o+n-m+j);
   *(o+n-m+j)=*(o+j);
   *(o+j)=q;
  }
}作用:有一排数,把前几个数往后移M位,使后面移出的数补到前面来
并输出
用指针
其中:N是数组元素数,M是需要输入的移位数,sert函数中的o是英文o不是数字0,用来转换值

解决方案 »

  1.   

    问题可能在变量的初值或者你录入的之中 , 建议你将语句“scanf("m=%d",&m);” 改成“scanf("%d",&m); ”
      

  2.   

    scanf("m=%d",&m);
    错了,好象没这用法吧
    你改成scanf("%d",&m);
    试试吧
      

  3.   

    scanf("m=%d",&m);
    这句话没错.
      

  4.   

    scanf("m=%d",&m);改为scanf("%d",&m);就可以了。
      

  5.   

    scanf("m=%d",&m);这句话没错.但你输入是应是m=1,输入m=1后要加回车键,scanf函数要求输入对应,这是要求。解决办法如上。
      

  6.   

    输入数据时,是不是
    应该输入M之后,回车呢?
    再者!
    奉劝你!
    scanf("m=%d",&m);
    改为scanf("%d",&m);
    这样可能回好一点!!
      

  7.   

    for(i=0;i<n;i++)
       scanf("%d",p+i);
    这个语句读入的是回车而不是你想要的数字,
      

  8.   

    改正如下:scanf("%d",p);//去掉回车for(i=0;i<n;i++)
       scanf("%d",p+i);
      

  9.   

    改正:
    scanf("m=%d",&m);      //在运行时要用格式:“m=3+回车”
     printf("\nplease input 10 data\n");
     for(i=0;i<n;i++)
       scanf("%d,",p+i);  //在运行时输入:1,2,3,4,5,6,7,8,9,0+回车“加了一个","号如果要直接输入:3+回车
    要把scanf("m=%d",&m);  改为 scanf("%d",&m);    
    不加逗号输入时用空格做分隔符  
      

  10.   


       q=*(o+n-m+j);
       *(o+n-m+j)=*(o+j);
       *(o+j)=q;
    你看看你这个地方有没有问题,我感觉有点不对
      

  11.   

    还是scanf("m=%d",&m); 有问题!应 改为 scanf("%d",&m);  
    你可以在下面加验证代码  #include<stdio.h>
    main()
    {void sert(int *,int,int);
     int n=10,i,m,a[10],*p;
     p=a;
     printf("please input m=\n");
     scanf("m=%d",&m);
     printf("\nplease input 10 data\n");
    //验证代码
    for(i=0;i<n;i++)
     
        printf("\n%d\n",a[i]);
    //你会发现scanf("m=%d",&m); 把m传给a[0]!全乱了!当然有问题! for(i=0;i<n;i++)
       scanf("%d",p+i);
     sert(p,m,n);
     for(i=0;i<n;i++)
      printf("%d,",*(p+i));
    }
    void sert(int *o,int m,int n)
    {int j,q;
      for(j=0;j<m;j++)
      {
       q=*(o+n-m+j);
       *(o+n-m+j)=*(o+j);
       *(o+j)=q;
      }
    }
      

  12.   

    贴错了
    #include<stdio.h>
    main()
    {void sert(int *,int,int);
     int n=10,i,m,a[10],*p;
     p=a;
     printf("please input m=\n");
     scanf("m=%d",&m);
     printf("\nplease input 10 data\n"); for(i=0;i<n;i++)
       scanf("%d",p+i);
    //应该在这里验证
    //验证代码
    for(i=0;i<n;i++)
     
        printf("\n%d\n",a[i]);
    //你会发现scanf("m=%d",&m); 把m传给a[0]!全乱了!当然有问题! sert(p,m,n);
     for(i=0;i<n;i++)
      printf("%d,",*(p+i));
    }
    void sert(int *o,int m,int n)
    {int j,q;
      for(j=0;j<m;j++)
      {
       q=*(o+n-m+j);
       *(o+n-m+j)=*(o+j);
       *(o+j)=q;
      }
    }
      

  13.   

    在这里设断点   printf("\n%d\n",a[i]);
    m已经不是您输入的数据了!
    p=a[0]=m!!!!
    所以你的程序在输入9个数时,就会结束,对不?
      

  14.   

    scanf("m=%d",&m);
    输入m时,由于m=存在,偏移到了p+i上,这时i=0,所以a[0]=你输入的m,而真正的m变成其他的值了。
      

  15.   

    我用你的源码编译后,什么都没有改,只能输入9个数啊?我用的是VC6+sp5.
    下面是输出结果:
    please input m=
    3please input 10 data
    1
    2
    3
    4
    5
    6
    7
    8
    9
    3,1,2,3,4,5,6,7,8,9,Press any key to continue出来的结果是10位,但是a[0]=你输入的m,这是
    事实。我用汇编看了,有m=时的地址偏移到了p+i上了。这是肯定的。如下是
    windiff比较的结果,有<!和 !>是不同的地方,你仔细看一下地址,我是不会骗你的,;-))) <!  7:     scanf("m=%d",&m);
    !>  7:     scanf("%d",&m);
        00401052   lea         ecx,[ebp-0Ch]
        00401055   push        ecx
     <! 00401056   push        offset string "m=%d" (0042504c)
     !> 00401056   push        offset string "%d" (00425034)
        0040105B   call        scanf (00401230)
        00401060   add         esp,8
        8:     printf("\nplease input 10 data\n");
     <! 00401063   push        offset string "\nplease input 10 data\n" (00425034)
     !> 00401063   push        offset string "\nplease input 10 data\n" (0042604c)
        00401068   call        printf (00401290)
        0040106D   add         esp,4
        9:
        10:    for(i=0;i<n;i++)
        00401070   mov         dword ptr [ebp-8],0
        00401077   jmp         main+62h (00401082)
        00401079   mov         edx,dword ptr [ebp-8]
        0040107C   add         edx,1
        0040107F   mov         dword ptr [ebp-8],edx
        00401082   mov         eax,dword ptr [ebp-8]
        00401085   cmp         eax,dword ptr [ebp-4]
        00401088   jge         main+83h (004010a3)
        11:      scanf("%d",p+i);
        0040108A   mov         ecx,dword ptr [ebp-8]
        0040108D   mov         edx,dword ptr [ebp-38h]
        00401090   lea         eax,[edx+ecx*4]
        00401093   push        eax
     <! 00401094   push        offset string "%d" (0042604c)
     !> 00401094   push        offset string "%d" (00425034)
        00401099   call        scanf (00401230)
        0040109E   add         esp,8
        004010A1   jmp         main+59h (00401079)
        12:
        13:
        14:   for(i=0;i<n;i++)
        004010A3   mov         dword ptr [ebp-8],0
        004010AA   jmp         main+95h (004010b5)
        004010AC   mov         ecx,dword ptr [ebp-8]
        004010AF   add         ecx,1
        004010B2   mov         dword ptr [ebp-8],ecx
        004010B5   mov         edx,dword ptr [ebp-8]
        004010B8   cmp         edx,dword ptr [ebp-4]
        004010BB   jge         main+0B4h (004010d4)
        15:    {
        16:       printf("\n%d\n",a[i]);
        004010BD   mov         eax,dword ptr [ebp-8]
        004010C0   mov         ecx,dword ptr [ebp+eax*4-34h]
        004010C4   push        ecx
        004010C5   push        offset string "\n%d\n" (00425028)
        004010CA   call        printf (00401290)
        004010CF   add         esp,8
        17:    }
        004010D2   jmp         main+8Ch (004010ac)
        
        
        
        
      

  16.   

    !> 00401056   push        offset string "%d" (00425034)这是没有m=时的地址----输入m
     <! 00401063   push        offset string "\nplease input 10 data\n" (00425034)而这是有m=时的地址,一样的!
    后面还有。这就是说有m=时输入m时,地址其实到了p+i的地方!好好看一下!
      

  17.   

    算法没问题,去掉m=就是你希望的结果!
    如下;
    please input m=
    3please input 10 data
    1
    2
    3
    4
    5
    6
    7
    8
    9
    12
    8,9,12,4,5,6,7,1,2,3,Press any key to continue
      

  18.   

    int main(int argc, _TCHAR* argv[])
    {void sert(int *,int,int);
     int n=10,i,m,*p;
     int a[10]={1,2,3,4,5,6,7,8,9,7};
     p=a;
     printf("please input m=\n");
     scanf("%d",&m);
     printf("\nplease input 10 data\n");
     //for(i=0;i<n;i++)
     //  scanf("%d",p+i);
     sert(p,m,n);
     for(i=0;i<n;i++)
      printf("%d,",*(p+i));
    }void sert(int *o,int m,int n)
    {int j,q;
      for(j=0;j<m;j++)
      {
       q=*(o+n-m+j);
       *(o+n-m+j)=*(o+j);
       *(o+j)=q;
      }
    }
    上面的程序测试正确。
     for(i=0;i<n;i++)
       scanf("%d",p+i);输入数据时 数据之间以空格分隔
      

  19.   

    结论就是m=的问题。。有m=
    输入数据时,如果是每一个都回车,肯定只能输9个,因为a[0]已经有了从你输入m的值。就是说,输完9个回车就出结果。当然输入数据时,数据之间以空格分隔,您可以输入10个,但最后那个已经被截掉了!可以验证一下。
      

  20.   

    谢谢诸位大哥!
       我明白了,其实算法、程序、及M=都没错,错的是我不小心在输入时每个数据后加了‘,’号,我把逗号去掉后,用M=及不用都正确!我用的是TC2编译器!
    我也很纳闷,为什么M=你们都说不行,照理论上讲SCANF中是可以用“M=”的,也就是说允许输入M=*,输入每个数据后加空格。最后输完后回车就OK
    正确的,看来这个问题还有待讨论
    本人QQ:19644753
      

  21.   

    谢谢诸位大哥:
       不是算法、程序、M=的问题,而是我在输入时在每个数据后加了“,”号,所以就是错误,如果不加“,”而加空格,那么用不用M=都可以得到正确结果!
    我用的是TC2编译器。其实理论上讲SCANF中加M=是合法的,只要在输入时加上相应项就可以。看来这个问题还有待诸位大哥好好讨论一下!:)
    本人QQ:19644753