如何将string
转换为char *
我正在使用以下方法,但它不起作用。
在运行时它会给我以下错误:
运行时检查失败#3 - 正在使用变量'url' 被初始化。
尽管我已经初始化了它,如下面的代码所示。你能告诉我一个例子吗?
char* url;
sup = "news"
sup="http://www."+sup+"yahoo.com";
strcpy(url, sup.c_str());
我在控制台中使用Microsoft Visual Studio 2010,C ++
答案 0 :(得分:5)
strcpy
没有为你分配内存,你必须自己动手,记住为空终止字符留出空间:
char* url = new char[sup.length()+1];
或
char url[sup.length()+1];
//...
strcpy(url, sup.c_str());
在第一种情况下,不要忘记delete[]
数组。第二种情况仅在编译器支持C99可变长度数组作为扩展时才有效。
答案 1 :(得分:3)
在我看来,有两种方法可以做到这一点。
使用& -operator(&符号)
string str = "hello";
char *p;
p = &str[0];
使用c_str()函数
string s = "hello";
const char *p;
p = s.c_str();
我测试了两者,他们都在工作。如果我错了,请纠正我。
答案 2 :(得分:2)
strcpy
不安全,因为可能会发生缓冲区溢出。使用strncpy
,您可以提供要复制的确切字节数。您需要为目标缓冲区分配内存并添加尾随\0
:
std::string strInsert("news");
std::string sup("http://www.");
sup += strInsert + "yahoo.com";
char* url = new char[sup.length() + 1];
strncpy(url, sup.c_str(), sup.length());
url[sup.length()] = '\0';
// ... use url
delete[] url;
答案 3 :(得分:1)
char* url = new char[100];
您必须先为char数组分配内存。
答案 4 :(得分:1)
如果你真的需要一个从std :: string的内容复制的char的可写缓冲区,你可以使用std::vector<char>
std::vector<char> urlAsVec( sup.begin(), sup.end() );
urlAsVec.push_back( '\0' );
char * url = &urlAsVec[0]; // pointer you can safely write to
您也可以这样初始化矢量:
std::vector<char> urlAsVec( sup.c_str(), sup.c_str() + sup.size() + 1 );
也将为你编写空终结符。
另一种选择:
std::vector<char> urlAsVec( sup.size() + 1 );
sup.copy( &urlAsVec[0], sup.size() );
请注意,向量会自动将其所有元素初始化为0,因此即使sup.copy()没有写入,也会出现空终止符。您可以使用sup.copy( ptr, len)
而不是strcpy,这可以稍微更安全,因为您可以指定缓冲区大小(尽管strncpy也允许这样做),尽管您仍然必须手动编写空终止符(或者已经使用它)分配)。
例如,如果你使用它:
char url[ BUFLEN ] = {0};
sup.copy( url, BUFLEN-1 );
对于某些固定值BUFLEN,您将获得写入缓冲区的源字符串的副本或部分副本。请注意,我的初始化程序确保所有未写入的字节都为0。
答案 5 :(得分:0)
从sup
复制到url
并不意味着您已初始化url
。
初始化url
意味着为其分配内存。像这样:
url = new char[size];
答案 6 :(得分:0)
std::string sup = "news";
sup="http://www."+sup+"yahoo.com";
char* url = new char[sup.length()+1];
url = const_cast<char*>(sup.c_str());
url[sup.length()] = '\0';
std::cout<<url; //http://www.newsyahoo.com
请注意网址末尾的'\0'
。