C ++ эквивалент .ToString () - PullRequest
       2

C ++ эквивалент .ToString ()

0 голосов
/ 27 сентября 2011

Должен быть простой способ сделать это ...

// C# code
    for (int i = 0; i < 20; i++)
        doSomething(i.ToString() + "_file.bmp");

Я пытаюсь сделать это в C ++, но оказывается, что самые простые вещи сложнее всего сделать в этом языке,Главным образом потому, что есть одна загвоздка: я ограничен библиотекой, которая принимает только char* в качестве параметра для функции, в которой это в конечном итоге заканчивается, поэтому я довольно сильно застрял, играя с массивами char.Вот что у меня есть:

char* path[12];
for(int i = 0; i < 20; i++)
{
    sprintf(path[0],"%i_Card.bmp",i);
    cards[i] = new Card(i,path[0]);
}

Проблема в том, что этот подход заканчивает меня одной большой длинной длинной бесполезной строкой.

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

Ответы [ 6 ]

6 голосов
/ 27 сентября 2011

С ++ 03 эквивалент ToString равен

std::stringstream stream;
stream << i;
std::string i_as_string = stream.str();

Обратите внимание, что вы также можете выполнить это без промежуточных переменных, выполнив ( std::stringstream() << i ).str().

В C ++ 11 есть и std::lexical_cast< std::string >( i ), который выполняет вышеуказанное для вас (также доступно в Boost), и std::to_string( i ).

5 голосов
/ 27 сентября 2011

Попробуйте это

#include <stdio.h>
#include <stdlib.h>

itoa(i)

atoi


Или вы можете пойти по этому маршруту:

#include <sstream>

int i = 5;
std::string s;
std::stringstream out;
out << i;
s = out.str();
1 голос
/ 27 сентября 2011

Я вижу несколько ошибок в вашем коде.

1) Вы объявляете «путь» как массив из 12 символьных указателей, но ни для одного из элементов массива не выделена память.Оператор sprintf гарантированно копируется в мусорную память.Я удивлен, что это не приведет к сбою вашей программы сразу.

2) И даже если для массива пути была выделена память, ваш оператор sprintf всегда копирует в путь [0] - перезаписывая то, что уже было там.

Я подозреваю, что вы путаете массивы символов, строки и массивы строк в C / C ++.Возможно, приведенный ниже код поможет.Я предполагаю , что ваш класс "Card" не сохраняет копию строки, переданной в качестве второго параметра, в переменную-член (по крайней мере, без ее копирования).В противном случае он будет указывать на стековую память - что может привести к ошибкам, если ваш экземпляр Card переживает функцию, в которой он был создан.

const size_t MAX_INTEGER_LENGTH = sizeof(int) * 4; // 4x the sizeof int will suffice no matter what the sizeof(int) is

char szPostfix[] = "_Card.bmp"; 

for(int i = 0; i < 20; i++)
{
    char path[MAX_INTEGER_LENGTH + sizeof(szPostfix) + 1]; //+1 for null terminator
    sprintf(path,"%d%s",i, szPostfix);
    cards[i] = new Card(i,path);
}
0 голосов
/ 27 сентября 2011

Из кода похоже, что это имя файла, а класс Card должен принимать путь как const char*.Таким образом, я думаю, что следующим способом будет c ++.

for(int i = 0; i < 20; i++)
{
    std::stringstream out;
    out << i << "_Card.bmp";
    cards[i] = new Card(i,out.str().c_str());
}
0 голосов
/ 27 сентября 2011

Нет общего способа преобразовать объект в строку в C ++.Вы должны определить свои функции преобразования самостоятельно.Для базовых типов вы можете конвертировать их в строки, используя stringstream.

#include <sstream>
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
  stringstream ss;
  ss << 1;
  cout << ss.str();
}

Более подробная информация о stringstream здесь

0 голосов
/ 27 сентября 2011

Вы можете использовать std::string и преобразовать его в c-строку, используя std::string::c_str().Тем не менее, он возвращает переменную строку const char *.const_cast можно использовать для дисквалификации констант, связанных с ним.

#include <iostream>
#include <string>
using namespace std;

void foo(char* str){
    cout << str << endl;
}

int main(){

    string str = "Hello World";
    foo(const_cast<char*>(str.c_str()));

    return 0;
}

Вывод: Hello World

Демо

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