将字符串值复制到地址中

时间:2014-02-19 17:55:19

标签: c++ string

我有以下课程

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的地址而不是字符串本身。我在这里做了很多搜索,找不到类似的东西。我不能在这个练习中使用动态记忆。

4 个答案:

答案 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());
}