Как преобразовать указатель char* в строку C++?

У меня есть C++ string, Мне нужно передать эту строку функции, принимающей char* параметр (например - strchr()).

а) Как мне получить этот указатель?

б) Есть ли какая-то функция, эквивалентная strschr() это работает для C++ strings?

8 ответов

Решение
  1. Чтобы получить C строковый эквивалент C++string использование объекта c_str функция.
  2. Чтобы найти первый случай char в string использование объекта find_first_of функция.

Пример:

string s = "abc";

// call to strlen expects char *
cout<<strlen(s.c_str());  // prints 3

// on failure find_first_of return string::npos
if(s.find_first_of('a') != string::npos)
    cout<<s<<" has an a"<<endl;
else
    cout<<s<<" has no a"<<endl;

Примечание: я дал strlen просто пример функции, которая принимает char*,

Удивительно, но std:;string обладает гораздо большими возможностями, чем строки в стиле C. Возможно, вам нужен метод find_first_of(). В общем, если вы используете функции strxxx() в C++ std::strings, вы почти наверняка делаете что-то не так.

Как и большая часть стандартной библиотеки C++, строковый класс является сложным зверем. Чтобы максимально использовать это, вам действительно нужен хороший справочник. Я рекомендую Стандартную библиотеку C++, написанную Николаем Йосуттисом.

Вы не можете получить char* из string

string не позволяет вам свободный доступ к своему внутреннему буферу. Самое близкое, что вы можете получить, это const char* с помощью .c_str() если вы хотите, чтобы ноль прекращался или .data() если он не должен быть завершен нулем.

Затем вы можете привести указатель, возвращенный этими функциями к char* но вы делаете это на свой страх и риск. Тем не менее, это относительно безопасное приведение, если вы уверены, что не меняете строку. Если вы изменили его, то указатель, который вы получили от c_str() может больше не быть действительным.

Этот код:

string str("Hello World!");
char* sp = (char*)str.c_str();
sp[5] = 'K';

наверное нормально
Однако это:

string str("Hello World!");
char* sp = (char*)str.c_str();
str = "Chaged string";
sp[5] = 'K';

совершенно определенно не в порядке.

Если в вашей строке используется str str.c_str() метод, чтобы получить символ * внутри него.

Возможно, этот пример поможет вам

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

int main ()
{
  string str ("Replace the vowels in this sentence by asterisks.");
  size_t found;

  found=str.find_first_of("aeiou");
  while (found!=string::npos)
  {
    str[found]='*';
    found=str.find_first_of("aeiou",found+1);
  }

  cout << str << endl;

  return 0;
}

Стандарт C++ предоставляет две функции-члена claass std::basic_string, которые возвращают указатель на первый элемент строки. Они есть c_str() а также data(), Но оба возвращают const char *, поэтому вы не можете использовать их с функцией, имеющей параметр типа char *.

Что касается функции strchr, то ее первый параметр const char *, Таким образом, вы можете использовать c_str() и data() с этой функцией. Однако гораздо лучше использовать функцию-член find()класса sttd::basic_string вместо strchr.

Если вы просто хотите назначить строковый литерал для pw, вы можете сделать это следующим образом

char *pw = "Hello world";

Если у вас есть объект C++ std::string, значение которого вы хотите присвоить pw, вы можете сделать это следующим образом

char *pw = some_string.c_str()

Однако значение, на которое указывает pw, будет действительным только в течение времени жизни some_string.

Больше здесь:
Как назначить строку для char *pw в C++

Удачи!!

std::string yourString("just an example");
char* charPtr = new char[yourString.size()+1];
strcpy(charPtr, yourString.c_str());
Другие вопросы по тегам