Как преобразовать указатель char* в строку C++?
У меня есть C++ string
, Мне нужно передать эту строку функции, принимающей char*
параметр (например - strchr()
).
а) Как мне получить этот указатель?
б) Есть ли какая-то функция, эквивалентная strschr()
это работает для C++ strings
?
8 ответов
- Чтобы получить
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*
,
Удивительно, но 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());