| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1532 人关注过本帖
标题:哪位大哥帮帮忙看看怎么改下 字符串复制问题
只看楼主 加入收藏
oicq
Rank: 1
等 级:新手上路
帖 子:34
专家分:1
注 册:2010-9-22
结帖率:85.71%
收藏
 问题点数:0 回复次数:15 
哪位大哥帮帮忙看看怎么改下 字符串复制问题
题目:

已知strcpy 函数的原型是:

char *strcpy(char *strDest, const char *strSrc);

其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy

下面是我写的代码
程序代码:
#include<iostream.h>
char *strcpy(char* strDest ,const char* strSrc);
void main ()
{
    char adress[]="String Copy";
    char* Dst="Why";
    strcpy(Dst,adress);
    cout<<Dst<<endl;   
}
char *strcpy(char* strDest ,const char* strSrc)
{
    if ( strDest == NULL || strSrc == NULL )
    {   
        cout<<"strDest == NULL || strSrc == NULL"<<endl;   
    }
   
    while ( (*strDest++ = *strSrc++ ) != '\0' )   
    {
         ;
    }
    return strDest;
}

为什么编译连接都没问题    运行时就报错
搜索更多相关主题的帖子: 字符 
2010-09-25 16:49
kspliusa
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:98
专家分:178
注 册:2009-9-27
收藏
得分:0 
char* Dst="Why";要申请空间
2010-09-25 17:11
zgxyz2008
Rank: 4
等 级:业余侠客
帖 子:67
专家分:202
注 册:2008-10-28
收藏
得分:0 
初步看一下,程序的思路有问题:strDest是局部指针变量,而子函数是不能返回局部指针变量和引用类型的,因为在子函数结束时,会释放掉所占内存;while语句中的赋值方式是错误的,指针变量是不能那样赋值的。最好应该重新考虑下方法。

[ 本帖最后由 zgxyz2008 于 2010-9-25 17:28 编辑 ]
2010-09-25 17:26
mxs810
Rank: 9Rank: 9Rank: 9
来 自:火星
等 级:贵宾
威 望:16
帖 子:234
专家分:1122
注 册:2006-10-19
收藏
得分:0 
应该首先考虑两个字符串中字符的个数,防止越界拷贝~~

授人以鱼不如授人以渔
2010-09-25 17:52
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
收藏
得分:0 
#include<iostream>
#include<cassert>
using namespace std;
char* strcpy1(char* strDest , const char* strSrc);
void main ()
{
    char* adress="String Copy";
    int length=strlen(adress);
    char* Dst="Why";
    Dst=new char[length+1];  // 确保Dst的空间比adress 大
    strcpy1(Dst,adress);
    cout<<Dst<<endl;   
}
char* strcpy1(char* strDest ,const char* strSrc)
{
    assert((strDest!=NULL)&&(strSrc!=NULL));
    char* temp=strDest;
    while(*strSrc!= '\0')
    {
        *strDest++ = *strSrc++;
    }
    *strDest='\0';  //保证strDest 它是字符串!!!
    return temp;
}
ok 啦!

If You Want Something, Go Get It, Period.
2010-09-25 18:38
oicq
Rank: 1
等 级:新手上路
帖 子:34
专家分:1
注 册:2010-9-22
收藏
得分:0 
   一上来看到这么多人 帮忙  嘿嘿 谢谢啦          

                                                                  D.神罗天征
2010-09-25 18:43
fairy_tail
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-09-26 10:49
幽园香客
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:231
专家分:142
注 册:2006-2-27
收藏
得分:0 
以下是引用kspliusa在2010-9-25 17:11:24的发言:

char* Dst="Why";要申请空间

楼上正解

做个有用的人!
2010-09-26 11:22
无名可用
Rank: 4
等 级:业余侠客
帖 子:79
专家分:259
注 册:2010-7-27
收藏
得分:0 
char* Dst="Why";句中Dst指向的是常量,对常量进行修改会引起运行错误的
2010-09-26 14:17
yangang2
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:64
专家分:432
注 册:2010-9-1
收藏
得分:0 
应该改为:
#include<iostream.h>
char *strcpy(char* strDest ,const char* strSrc);
void main ()
{
    char adress[]="String Copy";
    char  Dst[99]="Why";//不能写为char *Dst="Why";
    strcpy(Dst,adress);
    cout<<Dst<<endl;   
}
char *strcpy(char* strDest ,const char* strSrc)
{
    if ( strDest == NULL || strSrc == NULL )
    {   
        cout<<"strDest == NULL || strSrc == NULL"<<endl;   
    }
   
    while ( (*strDest++ = *strSrc++ ) != '\0' )   
    {
         ;
    }
    return strDest;
}
为什么不能将char  Dst[99]="Why";写为char *Dst="Why";因为字符串的存储形式有两种,一种是字符数组,一种是字符指针,但这两种是由差别的,字符数组可以对存储的字符串进行读写操作,而字符指针即你所定义的char *Dst="Why";只能进行读操作,不能进行写操作。当你尝试语句 while ( (*strDest++ = *strSrc++ ) != '\0' )   时就造成了致命错误,因为strDest接受的是指针Dst,而该指针所指向的字符串是不能进行写操作的。所以应该定义为数组,且数组要足够容纳被复制的字符串。

为了检验你是否懂了,可以在看看下面的论述:
利用指针来处理字符串时,要注意指针所指向的字符串是字符串常量还是存储在字符数组中的字符串,因为这两种字符串在处理时有很大差别。当指针指向的字符串是字符数组中的字符串时,可以用该指针对所指向的存储单元进行读写。当指针指向的字符串是字符串常量时,则只能用该指针对指向的存储单元进行读取。不能进行改写,因为C语言没有对这种情况进行定义。如果利用指向字符串常量的指针对它所值的存储单元进行改写,这个程序在编译时能够通过,在程序运行时可能就会出错。如:
#include"stdio.h"
main()
{
    char *s1="good morning!";
    char *s2="good afternoon!";
    char *p1,*p2;
    printf("before copying:\ns1:%s;\ns2:%s;\n",s1,s2);
    p1=s1;
    p2=s2;
    while(*p2++=*p1++);
    printf("after copying:\ns1:%s;\ns2:%s;\n",s1,s2);
}

为了避免这种错误,应改为以下形式:
#include"stdio.h"
main()
{
    char s1[]="good morning!";
    char s2[]="good afternoon!";
    char *p1,*p2;
    printf("before copying:\ns1:%s;\ns2:%s;\n",s1,s2);
    p1=s1;
    p2=s2;
    while(*p2++=*p1++);
    printf("after copying:\ns1:%s;\ns2:%s;\n",s1,s2);
}

对上面循环体为空语句的while循环的理解:可将其写成比较繁琐的形式
    while ((*p2=*p1)!='\0')
{
p2++;
p1++;
}

这段程序的含义是将字符串s1的第一个字符赋值给字符数组s2的第一个元素,然后判断赋值后的结果,也就是*p1是否不等于’\0’。如果*p1不等于’\0’,则执行循环体使指针p1和p2指向字符串的下一个字符。然后继续赋值,直到s1的结尾字符’\0’赋给字符串s2为止,才停止循环。这时已经将字符串s1的所有字符赋值给s2了。由于字符’\0’的值等于0,因此,表达式(*p2=*p1)!='\0'等价于(*p2=*p1)!=0,(对比一个变量时如while(*p2!=’\0’)类似于两个变量时的情况,即可以省略’\0’)而表达式(*p2=*p1)!=0又等价于*p2=*p1,所以上面这段程序又等价于:
    while (*p2=*p1)
{
p2++;
p1++;
}

又因为可以将指针p1和p2的自增运算放于表达式中,所以上面代码进一步简化为:
while(*p2++=*p1++);
当然这样简化后的唯一区别在于循环结束时,指针p1和p2指向的是’\0’后面的哪个存储单元,但这不影响程序要完成的功能。


2010-09-26 15:11
快速回复:哪位大哥帮帮忙看看怎么改下 字符串复制问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025923 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved