我有以下课程
class MyClass{
char myValue[14] //has a 13 character string in it already
public
void toStr(char* str) const;
}
指令是:成员函数toStr是一个查询,它接收一个C风格的,以null结尾的字符串的地址,并用该对象的值填充该地址 此函数假定调用者已分配足够的空间来容纳十三(13)个字符串。
所以我编码:
void myClass::toStr(char* str) const
{
std::strcpy(str, myValue);
}
然而str接收myValue的地址而不是字符串本身。我在这里做了很多搜索,找不到类似的东西。我不能在这个练习中使用动态记忆。
答案 0 :(得分:3)
以下是您在简单示例中使用的类(这是我希望您发布的所有内容,但由于某种原因您无法执行此操作)。
#include <cstring>
#include <iostream>
class MyClass
{
char myValue[14];
public:
void toStr(char* str) const;
MyClass() { std::strcpy(myValue, "0123456789012"); }
};
void MyClass::toStr(char* str) const
{ std::strcpy(str, myValue); }
int main()
{
MyClass m;
char testString[100];
m.toStr(testString);
std::cout << testString;
}
此功能按预期工作。我看到testString被分配了myValue文本。我在MyClass中添加了一个构造函数,以确保它与您描述的相同,即myValue在调用toStr之前有一个13个字符的字符串。
现在以我发布的那个例子为例,
1)更改您需要更改的内容以复制您的错误 - 以后可能会发表评论,为什么您所做的不起作用,或
2)指出您在上面的示例中看到的代码中遗漏的内容,从而修复错误。
这里没有抄袭,因为我不知道你的任务应该是什么 - 这纯粹是根据你的描述编写的。看看提供一个简单的例子是多么容易?
答案 1 :(得分:0)
在你的作业中写道,str只能容纳13个字符,而myValue被定义为14个字符的数组。因此,您应该使用std::strncpy
代替std::strcpy
例如
void myClass::toStr(char* str) const
{
std::strncpy(str, myValue, 13);
str[12] = '\0';
}
我认为你得到了奇怪的结果,因为myValue不是零终止的。如果您将两个字符串视为字节缓冲区,那么您应该使用函数std::memcpy
在这种情况下,函数将看起来像
void myClass::toStr(char* str) const
{
std::memcpy(str, myValue, 13);
}
我
答案 2 :(得分:0)
我们显然需要更多相关信息。但据我所知,您的主叫代码应如下所示:
MyClass a;
char *astr = new char[15]; //Allocate enough space for astr to hold myValue
a.toStr(astr);
cout << astr;
delete astr;
此外,值应在构造函数或任何其他setter中分配,如下所示:
strcpy(myValue,"Test String");
编辑:正如弗拉德在另一个答案中所解释的那样,strncpy
应该会更好。
此函数假定调用者已分配足够的空间 持有十三(13)个字符串。
这意味着在调用你的函数之前,你的字符串已经分配了空间(就像我用new做的那样)。
看起来你误解了问题。
答案 3 :(得分:0)
试试这个!您无需担心我的Value数组大小。
void myClass::toStr(char* pstr) const
{
std::string str(myValue);
pstr = new char[str.size()+1];
strcpy(pstr, str.c_str());
}