Strcpy不复制已分配的字符数组

时间:2012-04-04 14:42:35

标签: c++ arrays string character

为什么这不起作用:

SomeClass::SomeClass(char *lit) //Ctor
{
    str = new char[strlen(lit)+1]; // str is a pointer to char in SomeClass
    strcpy(str,"have");
    cout << str << " " << "In Ctor" << " +Size=" << strlen(str)<< endl;
}

上面的代码显示了一个长度为0的字符串。但是这段代码有效:

SomeClass::SomeClass(char *lit)
{
    char newstr[strlen(lit)+1];
    strcpy(newstr,"have");
    cout << newstr << " " << "In Ctor" << " +Size=" << strlen(newstr)<< endl;
}

Here 是完整的代码。

编辑:
添加了我回答问题后删除OP的Ideone链接 没有源代码的链接,这个Q&amp;回答它是没用的。

2 个答案:

答案 0 :(得分:4)

strcpy没有问题,你只是搞乱你的指针。

问题在于:

 str = new char[strlen(lit)+1];
 strcpy(str,lit);
 length=leng();    <------------- str points to \0 after this call
 cout << str << " " << "In Ctor" << " +Size=" << strlen(lit)<< endl;

str是您的类成员,您将指针str移动到指向函数\0中的leng(),当然,您没有看到任何输出下一个声明。

解决方案是将起始地址保存在函数内的单独指针中。

int String :: leng()
{
      int length=0;
      char *tempPtr= str;       <----------- Store the address in a temporary pointer
      while(*str)
      {
                 length++;
                 str++;
      }
      str = tempPtr;            <---------- Point the Pointer member to right address again
      return length;
}

答案 1 :(得分:0)

撰写String::leng()的另一种方式:

int String::leng()
{
    char *endPtr = str;
    while(*endPtr)
        endPtr++;
    return endPtr - str;
}