#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,用来转换值
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,用来转换值
错了,好象没这用法吧
你改成scanf("%d",&m);
试试吧
这句话没错.
应该输入M之后,回车呢?
再者!
奉劝你!
scanf("m=%d",&m);
改为scanf("%d",&m);
这样可能回好一点!!
scanf("%d",p+i);
这个语句读入的是回车而不是你想要的数字,
scanf("%d",p+i);
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);
不加逗号输入时用空格做分隔符
q=*(o+n-m+j);
*(o+n-m+j)=*(o+j);
*(o+j)=q;
你看看你这个地方有没有问题,我感觉有点不对
你可以在下面加验证代码 #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;
}
}
#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;
}
}
m已经不是您输入的数据了!
p=a[0]=m!!!!
所以你的程序在输入9个数时,就会结束,对不?
输入m时,由于m=存在,偏移到了p+i上,这时i=0,所以a[0]=你输入的m,而真正的m变成其他的值了。
下面是输出结果:
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)
<! 00401063 push offset string "\nplease input 10 data\n" (00425034)而这是有m=时的地址,一样的!
后面还有。这就是说有m=时输入m时,地址其实到了p+i的地方!好好看一下!
如下;
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
{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);输入数据时 数据之间以空格分隔
输入数据时,如果是每一个都回车,肯定只能输9个,因为a[0]已经有了从你输入m的值。就是说,输完9个回车就出结果。当然输入数据时,数据之间以空格分隔,您可以输入10个,但最后那个已经被截掉了!可以验证一下。
我明白了,其实算法、程序、及M=都没错,错的是我不小心在输入时每个数据后加了‘,’号,我把逗号去掉后,用M=及不用都正确!我用的是TC2编译器!
我也很纳闷,为什么M=你们都说不行,照理论上讲SCANF中是可以用“M=”的,也就是说允许输入M=*,输入每个数据后加空格。最后输完后回车就OK
正确的,看来这个问题还有待讨论
本人QQ:19644753
不是算法、程序、M=的问题,而是我在输入时在每个数据后加了“,”号,所以就是错误,如果不加“,”而加空格,那么用不用M=都可以得到正确结果!
我用的是TC2编译器。其实理论上讲SCANF中加M=是合法的,只要在输入时加上相应项就可以。看来这个问题还有待诸位大哥好好讨论一下!:)
本人QQ:19644753