Как добавить char в std::string?

Ниже приводится ошибка с ошибкой prog.cpp:5:13: error: invalid conversion from ‘char’ to ‘const char*’

int main()
{
  char d = 'd';
  std::string y("Hello worl");
  y.append(d); // Line 5 - this fails
  std::cout << y;
  return 0;
}

Я также пробовал следующее, которое компилируется, но ведет себя случайным образом во время выполнения:

int main()
{
  char d[1] = { 'd' };
  std::string y("Hello worl");
  y.append(d);
  std::cout << y;
  return 0;
}

Извините за этот немой вопрос, но я искал вокруг google, что я мог видеть, это просто "char массив до char ptr", "char ptr до char array" и т.д.

Ответ 1

y += d;

Я использовал бы оператор += вместо названных функций.

Ответ 2

Используйте push_back():

std::string y("Hello worl");
y.push_back('d')
std::cout << y;

Ответ 3

Чтобы добавить char в std::string var с помощью метода append, вам нужно использовать эту перегрузку:

std::string::append(size_type _Count, char _Ch)

Изменить: Правильно, я неправильно понял параметр size_type, отображаемый в контекстной справке. Это количество добавляемых символов. Поэтому правильный вызов

s.append(1, d);

не

s.append(sizeof(char), d);

Или самый простой способ:

s += d;

Ответ 4

В дополнение к другим упомянутым, один из конструкторов строк принимает char и количество повторений для этого char. Таким образом, вы можете использовать это, чтобы добавить один char.

std::string s = "hell";
s += std::string(1, 'o');

Ответ 5

Попробуйте использовать оператор + = текст ссылки, append() текст ссылки, или push_back() текст ссылки

Ссылки в этом сообщении также содержат примеры того, как использовать соответствующие API.

Ответ 6

Я тестирую несколько предложений, запустив их в большой цикл. Я использовал microsoft visual studio 2015 в качестве компилятора, а мой процессор - i7, 8Hz, 2GHz.

    long start = clock();
    int a = 0;
    //100000000
    std::string ret;
    for (int i = 0; i < 60000000; i++)
    {
        ret.append(1, ' ');
        //ret += ' ';
        //ret.push_back(' ');
        //ret.insert(ret.end(), 1, ' ');
        //ret.resize(ret.size() + 1, ' ');
    }
    long stop = clock();
    long test = stop - start;
    return 0;

В соответствии с этим тестом результаты:

     operation             time(ms)            note
------------------------------------------------------------------------
append                     66015
+=                         67328      1.02 time slower than 'append'
resize                     83867      1.27 time slower than 'append'
push_back & insert         90000      more than 1.36 time slower than 'append'

Заключение

+= кажется более понятным, но если вы не уверены в скорости, используйте append

Ответ 7

проблема с:

std::string y("Hello worl");
y.push_back('d')
std::cout << y;

заключается в том, что вы должны иметь "d", а не использовать имя char, например char d = 'd'; Или я не прав?

Ответ 8

int main()
{
  char d = 'd';
  std::string y("Hello worl");

  y += d;
  y.push_back(d);
  y.append(1, d); //appending the character 1 time
  y.insert(y.end(), 1, d); //appending the character 1 time
  y.resize(y.size()+1, d); //appending the character 1 time
  y += std::string(1, d); //appending the character 1 time
}

Обратите внимание, что во всех этих примерах вы могли бы использовать литерал буква напрямую: y += 'd';.

Ваш второй пример почти сработал бы по несвязанным причинам. char d[1] = { 'd'}; не работал, но char d[2] = { 'd'}; (обратите внимание, что массив имеет размер два) будет работать примерно так же, как const char* d = "d";, и может быть добавлен строковый литерал: y.append(d);.

Ответ 9

Попробуйте использовать указатель d в качестве указателя y.append(* г)

Ответ 10

str.append(10u,'d'); //appends character d 10 times

Заметьте, что я написал 10u, а не 10 для количества раз, когда я хотел бы добавить символ; замените 10 на любое количество.

Ответ 11

Если вы используете push_back, для конструктора строк нет вызова. В противном случае он создаст строковый объект с помощью каста, затем добавит символ в эту строку к другой строке. Слишком много проблем для крошечного персонажа;)