вернуть char1 + char2? Разве это не возможно? - PullRequest
4 голосов
/ 30 марта 2010

Я пытаюсь вернуть строку из функции. Который в основном добавляет несколько символов вместе и возвращает строковое представление.

string toString() {
   char c1, c2, c3;
   // some code here
   return c1 + c2; // Error: invalid conversion from `char' to `const char*'
}

возможно возвращать логические значения, такие как return c1 == 'x'. Разве нельзя вернуть строковые значения? Я знаю, что это возможно так:

string result;
result.append(c1, c2);
return result;

Я новичок в C ++, поэтому я подумал, что должно быть более элегантное решение.

Ответы [ 6 ]

9 голосов
/ 30 марта 2010

Нет, вы не можете этого сделать, потому что добавление двух символов вместе не даст вам строку. Это дает вам еще один символ; в этом случае 'a'+'b' фактически дает вам '├' (в Windows со стандартной кодовой страницей CP_ACP ). Char - это порядковый тип, такой как целые числа, и компилятор знает, как добавить их самым простым способом. Струны совершенно другого зверя.

Вы можете сделать это, но вы должны быть явными:

return string(1, c1) + string(1, c2)

Это создаст две временные строки, каждая из которых будет инициализирована одним повторением символа, переданного в качестве второго параметра. Поскольку operator+ определено для строк как функции конкатенации, теперь вы можете делать то, что хотите.

7 голосов
/ 30 марта 2010

char типы в C ++ (как и в C) являются целочисленными типами. Они ведут себя как целостные типы. Точно так же, как когда вы пишете 5 + 3 в своем коде, вы ожидаете получить целое 8 как результат (а не строку "53"), когда вы пишете c1 + c2 в своем коде выше, вы должны ожидать получить интегральный результат - арифметическая сумма c1 и c2.

Если вы действительно хотите объединить два символа в строку, вы должны сделать это по-другому. Есть много способов сделать это. Например, вы можете сформировать строку в стиле C

char str[] = { c1, c2, `\0` };

, который будет неявно преобразован в std::string на

return str;

Или вы можете построить std::string сразу (что также можно сделать несколькими различными способами).

4 голосов
/ 30 марта 2010

Вы можете преобразовать каждый символ в строку, а затем использовать +:

return string(1, c1)+string(1, c2);

Альтернативно, строка имеет перегрузку оператора + для работы с символами, поэтому вы можете написать:

return string(1, c1) + c2;

Независимо от того, какой метод вы выберете, вам нужно будет преобразовать целочисленный тип char в строку стиля C (char*) или строку стиля C ++ (std::string).

2 голосов
/ 30 марта 2010
return string(1, c1) + c2;

Создает 1-символьную строку, содержащую c1, затем добавляет (перегружен для объединения) c2 (создает другую строку) и возвращает ее.

1 голос
/ 30 марта 2010

Нет, они просто складывают коды символов. Вам необходимо преобразовать их в строки.

0 голосов
/ 30 марта 2010

Вам нужно создать строку из символов.
А затем вернуть строку (фактически копию строки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...