为什么这不起作用:
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;回答它是没用的。
答案 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;
}