c语言编程,c语言 将含n个字符的字符串中第m个字符开始复制到新的字符串中并输出,帮忙看下下面我的问题

编写函数:用指针实现把字符串1中第m个字符开始的所有字符复制成字符串2。实验提示①编写函数voidsubstrcpy(char*,int,char*)将字符串1中第m个字... 编写函数:用指针实现把字符串1中第m个字符开始的所有字符复制成字符串2。
实验提示
① 编写函数void substrcpy(char *,int ,char *)将字符串1中第m个字符开始的所有字符复制成字符串2。

② 在主函数中:
输入m,将字符串1输入到一维字符数组str1;
调用substrcpy函数;
输出字符串2

我初步写的但调试有错!
#include <stdio.h>
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)
{
*w2=*(w1+m);
}
展开
 我来答
White_MouseYBZ
2012-12-08 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6122万
展开全部
朋友,两位网友都说得对哟。你的代码就不可能通过编译,不知你是怎么运行的。首先有两个明显错误要更正一下:
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还有什么必要开发动态内存分配功能呢?
仅供参考……
上帝来自地球
推荐于2016-11-10 · TA获得超过1436个赞
知道小有建树答主
回答量:438
采纳率:100%
帮助的人:401万
展开全部
如下修改就好了,不明白追问!
#include <stdio.h>
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';
}
追问
能解释一下那个substrcpy函数吗!?
为什么我的错了!
追答
void substrcpy(char *w1, int m, char *w2)
{
*w2=*(w1+m);
}
你的就只是复制了一个字节,当然就不对了!
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友01136f8
2012-12-07 · TA获得超过906个赞
知道小有建树答主
回答量:177
采纳率:0%
帮助的人:182万
展开全部
楼主你好~

请做如下修改:

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[]的区别哦~
字符型数组的本质是数组哦,只是数组元素是字符型而已,但是字符串则是一个指向连续排列的字符的指针,这些字符开辟在内存中的静态区域,是只读的~

请追问~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式