朋友,两位网友都说得对哟。你的代码就不可能通过编译,不知你是怎么运行的。首先有两个明显错误要更正一下:
1.指针初始化
p1=str1;
p2=str2;
这两句,指针str1、str2还没有初始化,就是说它们还是野指针,怎么可以用来给p1、p2赋值呢?
2.指针接收输入数据
scanf("%d%s",&m,str1)中的str1还没有赋值,就是说它还没有指向一个你定义大小的地址空间,它怎么可以接收数据呢? char *str1,*str2,*p1,*p2声明指针,只是给这4个指针每个安排了存放它要指向的地址的一个4字节空间;只有让它们指向一个确定的地址,这4个字节中就存放了那个确定空间的首地址,这时指针才有效,才能接收数据。我看ikemodtid的办法就不错,用char str1[100],str2[100]来为str1和str2各分配100个字节空间,同时让它们各自指向了那属于自己的100个字节空间的首地址;如果你还想用p1、p2的话,就可用p1=str1、p2=str2来为p1、p2赋值了。可是看得出来,你不愿采纳!
从你的追问中看出,有一个概念并未完全搞明白:C确实是用字符数组处理字符串的,但指针与数组并不是一回事,不然教科书里为什么都有《指针与数组》一节?那就是讲指针与数组的关系的。数组可以不用指针处理,但若让一个指针指向了数组,就可以用指针来处理它指向的数组了,而且由于指针的优点而带来很多操作上的方便。但给一个没有指向数组的指针直接赋数组,那肯定是要出错的。想想看,如果只要声明一个char型指针就可以为其赋一个字符串的话,C还有什么必要开发动态内存分配功能呢?
仅供参考……
空字符是用来判定字符串结束的标记,m<=n+1 多的那个就是'\0' ,没有这个字符串输出就不正确了
不明白哦,你确定你的程序正确的?就看这几句吧,你四个指针所指向的存储空间在哪里?
char *str1,*str2,*p1,*p2;
int m,n=0;
void copy(char *,char *,int,int);
p1=str1;
p2=str2;
scanf("%d%s",&m,str1); //输入的字符串你放在哪里?指针还都NULL呢?肯定运行出错的
你没有给你的字符串划分空间,应该用数组来划分空间而不是指针。帮你编了个正确的。
#include
#include
int main(void)
{
char str1[100],str2[100];
int m;
scanf("%d",&m);
gets(str1);
strcpy(str2, &str1[m - 1]);
puts(str2);
return 0;
}