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

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

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

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

Ответ 1

  • Чтобы получить эквивалент строки C объект C++ string использует c_str функция.
  • Чтобы найти первое появление 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*.

Ответ 2

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

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

Ответ 3

Вы не можете получить 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';

наиболее определенно не в порядке.

Ответ 4

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

Ответ 5

Если вы просто хотите присвоить строковый литерал pw, вы можете сделать это, как

char *pw = "Hello world";

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

char *pw = some_string.c_str()

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

Подробнее здесь:
Как назначить строку char * pw в С++

GOODLUCK!!

Ответ 6

std::string yourString("just an example");
char* charPtr = new char[yourString.size()+1];
strcpy(charPtr, yourString.c_str());

Ответ 7

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

#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;
}

Ответ 8

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

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