Как преобразовать строку в char * в C ++? - PullRequest
3 голосов
/ 16 февраля 2012

Как я могу преобразовать string в char * Я использовал следующий метод, но он не работает.

Во время выполнения выдает следующую ошибку:

Ошибка проверки времени выполнения № 3 - переменная 'url' используется без инициализируется.

даже если я инициализировал его, как показано в коде ниже. Не могли бы вы показать мне пример?

    char* url;
    sup = "news"
    sup="http://www."+sup+"yahoo.com";
    strcpy(url, sup.c_str());

Я использую Microsoft Visual Studio 2010, C ++ в консоли

Ответы [ 7 ]

5 голосов
/ 16 февраля 2012

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

char* url = new char[sup.length()+1];

или

char url[sup.length()+1];
//...
strcpy(url, sup.c_str());

InВ первом случае не забудьте delete[] массив.Второй случай будет работать только в том случае, если ваш компилятор поддерживает массивы переменной длины C99 в качестве расширения.

3 голосов
/ 14 сентября 2012

На мой взгляд, есть два способа сделать это.

  1. Использование & -оператора (амперсанд)

    string str = "hello";
    char *p;
    p = &str[0];
    
  2. Использование функции c_str ()

    string s = "hello";
    const char *p; 
    p = s.c_str();
    

Я проверил оба, и они оба работают. Пожалуйста, поправьте меня, если я ошибаюсь.

2 голосов
/ 16 февраля 2012

strcpy небезопасно, так как может произойти переполнение буфера.Используйте strncpy, если вы предоставляете точное количество байтов для копирования.Вам нужно выделить память для буфера назначения и добавить конечный \0:

std::string strInsert("news");
std::string sup("http://www.");
sup += strInsert + "yahoo.com";

char* url = new char[sup.length() + 1];
strncpy(url, sup.c_str(), sup.length());
url[sup.length()] = '\0';
// ... use url
delete[] url;
1 голос
/ 16 февраля 2012

Если вам действительно нужен доступный для записи буфер char, скопированный из содержимого std :: string, вы можете использовать std::vector<char>

std::vector<char> urlAsVec( sup.begin(), sup.end() );
urlAsVec.push_back( '\0' );
char * url = &urlAsVec[0]; // pointer you can safely write to

Вы также можете инициализировать вектор следующим образом:

std::vector<char> urlAsVec( sup.c_str(), sup.c_str() + sup.size() + 1 );

, который также напишет ваш нулевой терминатор для вас.

Другая альтернатива:

std::vector<char> urlAsVec( sup.size() + 1 );
sup.copy( &urlAsVec[0], sup.size() );

Обратите внимание, что ваш вектор автоматически инициализирует все свои элементы равными 0, поэтому нулевой терминатор будет там, даже если sup.copy () не записывает его. В любом случае вы можете использовать sup.copy( ptr, len) вместо strcpy, что немного безопаснее, поскольку вы можете указать размер буфера (хотя strncpy и это допустит), хотя вам все равно придется писать нулевой терминатор вручную (или он уже выделен) .

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

char url[ BUFLEN ] = {0};
sup.copy( url, BUFLEN-1 );

для некоторого фиксированного значения BUFLEN вы получите копию или частичную копию исходной строки, записанной в ваш буфер. Обратите внимание, что мой инициализатор гарантирует, что все ваши неписанные байты равны 0.

1 голос
/ 16 февраля 2012
char* url = new char[100];

Сначала вы должны выделить память для вашего массива символов.

0 голосов
/ 16 февраля 2012
std::string sup = "news";
sup="http://www."+sup+"yahoo.com";
char* url = new char[sup.length()+1];
url = const_cast<char*>(sup.c_str());
url[sup.length()] = '\0';

std::cout<<url;            //http://www.newsyahoo.com

Обратите внимание на '\0' в конце URL.

0 голосов
/ 16 февраля 2012

Копирование из sup в url не означает, что вы инициализировали url.
Инициализация url означает выделение памяти для него.Как это:

url = new char[size];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...