Как преобразовать указатель 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.