Указатели и символы * - PullRequest
       20

Указатели и символы *

0 голосов
/ 17 октября 2011

Мой синтаксис 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-> next из-за отсутствия правильного знания синтаксиса.
  2. У меня есть Message.msgдобавляется после заголовка, но способ вызова этого метода выглядит следующим образом:

    m->msgAddHdr(h1,5);
    

Как использовать этот m внутри моего метода?

Ответы [ 4 ]

2 голосов
/ 17 октября 2011
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::vector и std::string. Как только вы начнете использовать C ++, вам действительно следует вообще избегать char* работы. Это грязно и трудно понять правильно. Собственные конструкции C ++ намного проще.

Я бы настоятельно рекомендовал вам просто выбросить весь этот код и попробовать создать версию на основе std::string.

0 голосов
/ 17 октября 2011

Как уже упоминали другие люди в своих ответах, вы используете ++temp для увеличения указателя (в необработанном указателе нет элемента ->next).

Но у вас есть большая проблема, что ваша функция не может работать. У вас есть указатель на строковый буфер, к которому вы хотите добавить, но вы не знаете, что буфер достаточно длинный, чтобы сделать это. Здесь есть различные варианты, но манипулирование строками выглядит очень похоже на C; Я предлагаю вам лучше использовать идиомы С ++, т.е. пусть ваша функция возвращает строковый объект вместо манипулирования существующим буфером, например:

std::string Message::msgAddHeader(const char* hdr, size_t length) {
    return std::string(hdr, hdr + length) + msg;
}
0 голосов
/ 17 октября 2011

Я не уверен, в каком синтаксисе написан ваш код, но на самом деле это не 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
}

Я не уверен, будет ли это делать то, что вы пытаетесь сделать. Кажется, вы просто пытаетесь выполнить базовую конкатенацию.

0 голосов
/ 17 октября 2011
  1. temp = temp->next, что вы ищете, это ++temp;.Таким образом, вы можете просто сделать temp += length.
  2. . Вы можете получить доступ к сообщению фактического экземпляра с помощью this->msg или просто msg, если msg объявлено в вашем Message классе.
...