指针和char *

时间:2011-10-16 21:02:06

标签: c++ pointers char

我的C ++语法非常生疏。这是我的代码:

/*
Add hdr of length length to the msg.
*/

void Message::msgAddHdr(char *hdr, size_t length)
{
    char *temp;          //temp to iterate through hdr
    size_t i;            //iterator

    temp=hdr;//Set temp to beginning of header

    //Iterate temp to the last letter of the header
    for(i=0; i < length; i++)
    {
        *temp = temp -> next;
    }
    //Delete the null terminator after the hdr
    delete *temp -> next;   
    //Set what temp is pointing to (which should be the last letter of the
    //header) to point to the msg.
    *temp -> next = Message.msg;
    //Delete temp when you're done with it?
    delete temp;

    return;
}

我遇到的两个大问题是:

  1. 如何更改指针指针指向的内容? (即temp指向hdr内部需要指向新位置的指针)由于缺乏正确的语法知识,我有“* temp-&gt; next。”
  2. 我在标题后添加Message.msg,但调用此方法的方式如下:

    m->msgAddHdr(h1,5);
    
  3. 如何在我的方法中使用那个?

4 个答案:

答案 0 :(得分:2)

for(i=0; i < length; i++)
{
    *temp = temp -> next;
}

我认为您的意思是temp增加length个元素。这是通过

实现的
temp += length;

char*上没有可用的方法。

//Delete the null terminator after the hdr
delete *temp -> next;   

无法在此处致电delete。您只能使用delete拨打new。而且你不能从char* C字符串的中间删除字符。

//Set what temp is pointing to (which should be the last letter of the
//header) to point to the msg.
*temp -> next = Message.msg;

不确定你在这里要做什么。没有next。我想我们需要了解更多有关Message.msg的信息。目前我们甚至不知道它是什么类型。

//Delete temp when you're done with it?
delete temp;

您没有使用temp分配new,因此您不能也不应该在其上拨打delete

return;

无需执行此操作,void函数将在到达结束时执行此操作。


更一般地说,我认为你需要回到你的教科书并了解基础知识。由于您使用的是C ++,因此可以使用更高级别的构造,如std::vectorstd::string。一旦开始使用C ++,您应该完全避免char*工作。这很麻烦,很难做对。原生C ++结构要简单得多。

我强烈建议您抛弃所有这些代码并尝试提出基于std::string的版本。

答案 1 :(得分:0)

  1. 您要搜索的temp = temp->next项是++temp;。所以你可以简单地做temp += length
  2. 如果在this->msg课程中宣布msg,您可以使用msgMessage访问实际实例的消息。

答案 2 :(得分:0)

我不确定你的代码是用什么语法编写的,但它不是真正的C ++,而且我不确定你要完成什么。无论如何,代码的正确语法可能是:

void Message::msgAddHdr(char* hdr, size_t length)
{
    char* temp = hdr; // declare a pointer to the header
    temp += length; // this sets the pointer to the last letter in header
    for (int i = 0; i < LENGTH_OF_MSG; ++i)
        *(++temp) = Message.msg[i]; // copy message to the end of header
    // also, you sure it's not Message::msg and Message.msg?
    // you need to make sure you have room, and you also need the length of
    // the message

    *temp = '\0'; // null-terminate the header
    // no deletion required since you're not allocating anything here
}

我不确定这是否会做你想要做的事情。看来你只是想做一个基本的连接。

答案 3 :(得分:0)

正如其他人在答案中提到的那样,你使用++temp来增加指针(原始指针上没有->next成员)。

但是你有一个更大的问题,你的功能无法运作。你有一个指向你想要追加的字符串缓冲区的指针,但是你不知道缓冲区是否足够长。这里有各种选项,但你正在做的字符串操作看起来很像C;我建议你最好使用C ++习语,即。让函数返回一个字符串对象,而不是操纵现有的缓冲区,例如:

std::string Message::msgAddHeader(const char* hdr, size_t length) {
    return std::string(hdr, hdr + length) + msg;
}