朋友,两位网友都说得对哟。你的代码就不可能通过编译,不知你是怎么运行的。首先有两个明显错误要更正一下:
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还有什么必要开发动态内存分配功能呢?
仅供参考……
如下修改就好了,不明白追问!
#include
void substrcpy(char *w1,int ,char *w2);
void main()
{
int n ;
char word1[100]="abcdefghijklmnopqrstuvwxyz";
char word2[100]="";
char *p1=0;
char *p2=0;
p1=word1;
p2=word2;
int i=0;
printf("请输入从第几位开始复制:\n");
scanf("%d",&n);
substrcpy(p1,n,p2);
for(;*p2!='\0';p2++){
word2[i]=*p2;
i++;
} /*while(*p2!='\0') { printf("%c",*p2); p2++; }*/
printf("第%d位后面的字符串是:",n);
puts(word2);
putchar('\n');
}
void substrcpy(char *w1, int m, char *w2)
{
while(*w1!='\0'){
*w2=*(w1+m);
w1++;
w2++;
}
*w2='\0';
}
楼主你好~
请做如下修改:
void substrcpy(char **w1,int ,char **w2); // substrcpy()函数这样定义
然后
void substrcpy(char **w1, int m, char **w2)
{
*w2=(*w1+m); // 这样进行字符串赋值
}
最后调用时:
substrcpy(&p1,n,&p2);
楼主这里是没弄明白char *str和char str[]的区别哦~
字符型数组的本质是数组哦,只是数组元素是字符型而已,但是字符串则是一个指向连续排列的字符的指针,这些字符开辟在内存中的静态区域,是只读的~
请追问~