注册 登录
编程论坛 C++教室

用C自己写一个string copy函数 帮忙看看哪里写的不对

lindayanglong 发布于 2008-10-23 16:46, 2565 次点击
#include<iostream>
using namespace std;
void stringcopy(char *p)
{
    char *ps;
    while(*p!='\0')
    {
        *ps=*p;
        ps++;
        p++;
    }

    cout<<ps<<endl;
}
void main()
{
    char *p="abcdeffg";
    
    stringcopy(p);
}
15 回复
#2
beyondlwm2008-10-23 16:51
*ps=*p;

这个没有意义。
#3
lmyouya2008-10-23 16:53
#include<iostream>
using namespace std;
void stringcopy(char *p)
{
    char *ps,a[20];
    ps=a;
    while(*p!='\0')
    {
        *ps=*p;
        ps++;
        p++;
    }
    *ps='\0';
    ps=a;
    cout<<ps<<endl;
}
void main()
{
    char *p="abcdeffg";
   
    stringcopy(p);
}
#4
lmyouya2008-10-23 17:03
[bo][un]lindayanglong[/un] 在 2008-10-23 16:46 的发言:[/bo]
void stringcopy(char *p)
{
    char *ps;         
    while(*p!='\0')
    {
        *ps=*p;
        ps++;
        p++;
    }

    cout<<ps<<endl;
}


 char *ps;  //这里只申请了一个空间!

*ps=*p;
ps++;      //ps指向下一个字节,超过申请的一个字节的内存空间,发生栈溢出,很危险
            //这就是传说中的溢出漏洞的一个简单例子,如果好好的构造一个 *p=shellcode;
            //还发生很有趣的事情,有趣到可以写一本书

p++;

[[it] 本帖最后由 lmyouya 于 2008-10-23 17:07 编辑 [/it]]
#5
huxiangking2008-10-23 19:42
顶 受益匪浅
#6
newyj2008-10-23 20:31
#include<iostream>
#include<cstring>
using namespace std;
char* stringcopy(char*);

int main()
{
  char* pi="abcdefg";
  char* ptr=stringcopy(pi);
  delete [] ptr;
  getchar();
  return 0;  
}

char* stringcopy(char* i)
{
  char* pstr=new char[strlen(i)+1];
  while(*i!='\0')
  {
    *pstr++=*i++;            
  }
  *pstr='\0';
  cout<<pstr<<endl;
  return pstr;      
}
不知道 为什么 不显示

[[it] 本帖最后由 newyj 于 2008-10-23 23:26 编辑 [/it]]
#7
lmyouya2008-10-23 21:50
修改后的代码:
程序代码:
#include<iostream>
#include<cstring>
using namespace std;
char* stringcopy(char*);

int main()
{
  char* pi="abcdefg";
  char* ptr=stringcopy(pi);
  delete [] ptr;
  getchar();
  return 0;  
}

char* stringcopy(char* i)
{
char *pstr=new char[20],*head;
cout<<i<<endl;
    head=pstr;
  while(*i!='\0')
  {
    *pstr++=*i++;
  }
  *pstr='\0';
  return head;      
}



你想想你原来的程序的运行过程序:
i=&"abcdefg"
*i=a *pstr='a';
i++ pstr++
*i='b' *pstr='b'
i++ pstr++
...
...
i指向'\0', 所以这时 cout不出来!
pstr指向了一个不是刚才 new 出来的地址的第一个地址的,返回了这样一个地址(可以返回!),但可能运行实时出错(栈溢出)。
没在汇编级运行,不是很清楚,有说错了的地方还请见谅。吖吖很菜很菜!

[[it] 本帖最后由 lmyouya 于 2008-10-24 11:29 编辑 [/it]]
#8
newyj2008-10-23 23:30
不知道 ls是否运行过 这段代码
new出来的 在 函数结束时 并没有 被撤消 所以 可以返回
不知道 你所说的 错误 是否 就是这个?
还有最后那个输出的i是写错了 并不是 有意 写成i的
#9
Go20092008-10-24 00:39
回复 3# lmyouya 的帖子
*ps='\0';
ps=a;
请问上面两句是什么意思?在这个程序里是什么作用。我不是很明白。谢谢···
#10
还是个蛋2008-10-24 11:00
  额 看不懂。。。。不好意思    才开始学。。。
#11
lmyouya2008-10-24 11:24
[bo][un]newyj[/un] 在 2008-10-23 23:30 的发言:[/bo]

不知道 ls是否运行过 这段代码
new出来的 在 函数结束时 并没有 被撤消 所以 可以返回
不知道 你所说的 错误 是否 就是这个?
还有最后那个输出的i是写错了 并不是 有意 写成i的


哦,真聪明!
我都说错了,不好意思!

new是可返回的!  
可pstr指向的地址不再是刚开始的new的地址,返回好像会栈溢出. 好像我真正想说的是这个意思!

还有最后那个输出的i是写错了 并不是 有意 写成i的
不明白?
#12
lmyouya2008-10-24 11:26
[bo][un]Go2009[/un] 在 2008-10-24 00:39 的发言:[/bo]

*ps='\0';
ps=a;
请问上面两句是什么意思?在这个程序里是什么作用。我不是很明白。谢谢···


字符串结束:*ps='\0';
ps=a; ps指向a的第一个字母的地址.
#13
Go20092008-10-24 12:06
[bo][un]lmyouya[/un] 在 2008-10-24 11:26 的发言:[/bo]



字符串结束:*ps='\0';
ps=a; ps指向a的第一个字母的地址.

 
根据你写的这个程序,ps指向a的第一个字母的地址,是不是a至少应分配8个空间,就是a[x]中x>=8?谢谢···我对这个不是很明白。
#14
braveboy20082008-10-24 13:12
最好将char *pstr=new char[20]改为char *pstr = new char[strlen(i)+1]这样即能适合不同长度的字符串,也不会浪费多余自由存储区;
#15
lockhawk2008-10-24 14:08
为什么可以直接输出cout<<ps<<endl; ??
不是说指针只是指向数组的第一个元素么?
#16
lpf112301082008-10-24 15:19
#include<iostream.h>
#include<string.h>
#include<assert.h>
void stringcopy(const char *p)
{
    char *ps=new char[strlen(p)+1];
    char *rs=ps;
    assert((ps!=NULL)&&(p!=NULL));
    while((*p!='\0')&&(*ps++=*p++));
    *ps='\0';
    cout<<rs<<endl;
    delete [] rs;
}
void main()
{
    char *p="abcdeffg";
    stringcopy(p);
}
1