如何在C ++中将字符串转换为char *?

时间:2012-02-16 10:50:17

标签: c++ visual-c++

如何将string转换为char *我正在使用以下方法,但它不起作用。

在运行时它会给我以下错误:

  

运行时检查失败#3 - 正在使用变量'url'   被初始化。

尽管我已经初始化了它,如下面的代码所示。你能告诉我一个例子吗?

    char* url;
    sup = "news"
    sup="http://www."+sup+"yahoo.com";
    strcpy(url, sup.c_str());

我在控制台中使用Microsoft Visual Studio 2010,C ++

7 个答案:

答案 0 :(得分:5)

strcpy没有为你分配内存,你必须自己动手,记住为空终止字符留出空间:

char* url = new char[sup.length()+1];

char url[sup.length()+1];
//...
strcpy(url, sup.c_str());

在第一种情况下,不要忘记delete[]数组。第二种情况仅在编译器支持C99可变长度数组作为扩展时才有效。

答案 1 :(得分:3)

在我看来,有两种方法可以做到这一点。

  1. 使用& -operator(&符号)

    string str = "hello";
    char *p;
    p = &str[0];
    
  2. 使用c_str()函数

    string s = "hello";
    const char *p; 
    p = s.c_str();
    
  3. 我测试了两者,他们都在工作。如果我错了,请纠正我。

答案 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'