У меня есть С++ string. Мне нужно передать эту строку функции, принимающей параметр char* (например, strchr()).
a) Как получить этот указатель?
b) Существует ли какая-либо функция, эквивалентная strschr(), которая работает для C++ strings?
У меня есть С++ string. Мне нужно передать эту строку функции, принимающей параметр char* (например, strchr()).
a) Как получить этот указатель?
b) Существует ли какая-либо функция, эквивалентная strschr(), которая работает для C++ strings?
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:; имеет гораздо больше возможностей, чем строки в стиле C. Вероятно, вам нужен метод find_first_of(). В общем, если вы используете функции strxxx() в std:: strings на С++, вы почти наверняка делаете что-то неправильно.
Как и большая часть стандартной библиотеки С++, класс строк представляет собой сложный зверь. Чтобы максимально использовать его, вам действительно нужен хороший справочник. Я рекомендую Стандартную библиотеку С++, автор Nicolai Josuttis.
Вы не можете получить 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() для получения char * внутри него.
Если вы просто хотите присвоить строковый литерал pw, вы можете сделать это, как
char *pw = "Hello world";
Если у вас есть С++ std::string объект, значение которого вы хотите назначить pw, вы можете сделать это как
char *pw = some_string.c_str()
Однако значение, которое pw указывает на, будет действительным только для времени жизни some_string.
Подробнее здесь:
Как назначить строку char * pw в С++
GOODLUCK!!
std::string yourString("just an example");
char* charPtr = new char[yourString.size()+1];
strcpy(charPtr, yourString.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;
}
Стандарт С++ предоставляет две функции-члена claass std:: basic_string, которые возвращают указатель на первый элемент строки. Они c_str() и data(). Но оба return const char *, поэтому вы не можете использовать их с функцией с параметром типа char *.
Что касается функции strchr, то ее первым параметром является const char *. Таким образом, вы можете использовать c_str() и data() с этой функцией. Однако гораздо лучше использовать функцию-член find() класса sttd:: basic_string вместо strchr.