Как преобразовать указатель char * в строку C ++? - PullRequest
10 голосов
/ 25 апреля 2010

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

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

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

Ответы [ 8 ]

20 голосов
/ 25 апреля 2010
  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*.

6 голосов
/ 25 апреля 2010

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

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

4 голосов
/ 25 апреля 2010

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

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

0 голосов
/ 31 декабря 2013

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

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

0 голосов
/ 25 апреля 2010

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

#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;
}
0 голосов
/ 25 апреля 2010
std::string yourString("just an example");
char* charPtr = new char[yourString.size()+1];
strcpy(charPtr, yourString.c_str());
0 голосов
/ 25 апреля 2010

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

char *pw = "Hello world";

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

char *pw = some_string.c_str()

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

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

GOODLUCK !!

0 голосов
/ 25 апреля 2010

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

...