Предпочтительное преобразование из char (не char *) в std :: string - PullRequest
41 голосов
/ 18 января 2011

У меня есть char, простой старый персонаж, которого я хотел бы превратить в std::string. std::string(char) не существует, конечно. Я мог бы создать массив символов и скопировать его, я мог пройти через струнные потоки или множество других маленьких обходных маршрутов. В настоящее время я предпочитаю boost::lexical_cast, но даже это кажется слишком многословным для этой простой задачи. Так какой же предпочтительный способ?

Ответы [ 4 ]

75 голосов
/ 18 января 2011

std::string имеет конструктор, который принимает число и символ. Персонаж будет повторяться указанное количество раз. Таким образом, вы должны использовать:

std::string str(1, ch);
5 голосов
/ 18 января 2011

просто использовать перегрузку, которая принимает символ?

т.е. string(1, 'A')

3 голосов
/ 18 января 2011

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

char c = 'x';
std::string(&c, &c + 1);

Обновление:

Хороший вопрос, Джеймс и GMan.Только что искал свободно загружаемый "Новый стандарт C" Дереком М. Джонсом для "указателя прошлого", и мой первый хит был:

Если выражение P указывает на элемент объекта массива и выражениеQ указывает на последний элемент того же объекта массива, выражение указателя Q + 1 сравнивается больше, чем P ... даже если Q + 1 не указывает на элемент объекта массива ...

Onсегментированные архитектуры, увеличивающие указатель за конец сегмента, заставляют адрес переносить сегментированную архитектуру к началу этого сегмента (обычно это адрес ноль).Если в таком сегменте выделен массив, либо реализация должна убедиться, что после массива есть место, чтобы иметь место после конечного адреса, либо использовать другой метод реализации для обработки этого случая (например, если сегментused является частью представления указателя, может быть назначено специальное значение после значения конечного сегмента) ...

Модель реляционного оператора C позволяет обрабатывать указатели на объекты так же, как индексы в объектах массива,Реляционные сравнения между индексами в двух разных объектах массива (которые не являются подобъектами более крупного объекта) редко имеют какое-либо значение, и стандарт не определяет такую ​​поддержку указателей.Некоторые приложения должны использовать информацию об относительном расположении различных объектов в хранилище.Однако такое использование не было сочтено достаточно полезным для Комитета, чтобы указывать модель, определяющую поведение ...

Большинство реализаций не выполняют никаких проверок до какой-либо операции со значениями, имеющими тип указателя.Большинство процессоров используют те же инструкции для выполнения реляционных сравнений с типами указателей, что и для арифметических типов.Для процессоров, которые используют архитектуру сегментированной памяти, значение указателя часто представляется с использованием двух компонентов: номера сегмента и смещения в этом сегменте.Следствием этого представления является то, что существует много преимуществ в выделении хранилища для объектов таким образом, что оно помещается в пределах одного сегмента (то есть хранилище для объекта не охватывает границу сегмента).Одним из преимуществ является оптимизация, включающая сгенерированный машинный код для некоторых из реляционных операторов, который должен только проверять компонент смещения сегмента.Это может привести к ситуации, когда p> = q ложно, но p> q верно, когда p и q указывают на разные объекты.

2 голосов
/ 15 июля 2015

Это работает на gcc C ++ 4.9.2 (http://ideone.com/f3qhTe)

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    std::string test;

    test = (char) 76;
    test += (char) 77;
    test += (char) 78;
    test += (char) 79;

    std::cout << "test contains: " << test << std::endl;
    return 0;
}
...