Как сделать копию символа, а не ссылку на C ++ - PullRequest
1 голос
/ 25 мая 2010

Если я объявлю функцию, подобную этой:

string hash (char* key)

тогда любое изменение, которое я сделаю для клавиши, также изменит ее значение при выходе из функции, верно?

Я хочу сделать копию этого в функции, чтобы я мог безопасно изменить его, не меняя исходного значения.

Я пробовал это, но это не работает.

char temp = key;

Как это можно сделать?

Ответы [ 6 ]

9 голосов
/ 25 мая 2010

Вероятно, наиболее очевидным было бы изменить ваш параметр на строку:

std::string hash(std::string key) { 
    // ...
}

В типичном случае вы бы хотели, чтобы это было std::string const &, но в этом случае вы хотите модифицируемую копию оригинала, поэтому вы передаете строку по значению. Поскольку строка (неявно) может быть построена из char *, вы все равно можете без проблем передавать ей указатели на char (и компилятор будет автоматически создавать строку там, где это необходимо).

2 голосов
/ 25 мая 2010
std::string tmp(key);

tmp будет инициализирован для копии ключа. Убедитесь, что ключ завершен нулем, иначе это закончится слезами. См. this для обзора std::string ctors.

Объявите функцию как std::string hash(const char* key);. Это сделает очевидным, что ключ не изменится, и защитит вас от случайного изменения.

0 голосов
/ 18 ноября 2011

char temp = *key; Я верю.

0 голосов
/ 25 мая 2010

Используйте strcpy, если хотите сохранить параметр в качестве указателя на символ.

Определение:

char *strcpy(char *destination, const char *source);

Вы также используете strdup

0 голосов
/ 25 мая 2010

Я думаю, что ваш синтаксис для копирования массива символов в std::string немного неправильный. Чтобы сделать копию строки, просто сделайте это:

std::string copy(key);

Если подумать, std::string = (char*)something должно сработать, поскольку строка определяет оператор присваивания.

0 голосов
/ 25 мая 2010

просто используйте

string hash(char key)

это поместит символ в стек, и только его локальная версия будет использоваться в рамках функции.

О, читая это снова, возможно, вы захотите скопировать строку вместо одного символа, в этом случае вы можете использовать strdup, но не забудьте освободить его память в конце функции. Наконец, вы также можете использовать конструктор копирования класса string, если планируете преобразовать его в std::string в любом случае.

...