2012-02-16 77 views
3

如何将string转换为char *我正在使用以下方法,但它不起作用。如何将字符串转换为char *在C++中?

在运行时,它给了我下面的错误:

Run-Time Check Failure #3 - The variable 'url' is being used without being initialized.

eventhough我已初始化它,如代码波纹管。你能给我一个例子吗?

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

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

+0

如果你只是想使用字符指针,你可以简单地使用sup.c_str(),而不是再次为变量'url'分配相同数量的字节。 – PermanentGuest 2012-02-16 11:02:23

+0

@Unni它会是一个常量字符*虽然(不只是一个字符*)。但我同意这可能是实际需要的。 – adelphus 2012-02-16 11:28:32

+1

我会在任何地方使用'std :: string',直到你需要将它传递给遗留系统。然后使用'std :: string :: c_str()'。有没有理由你不能使用'std :: string'? – 2012-02-16 11:51:48

回答

5

strcpy不为你分配内存,你必须自己做,记得留出空间为空值终止字符:

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

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

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

+0

非常感谢。现在效果很好 – 2012-02-16 10:59:44

+1

它可能工作得很好,但这不是我认为最好的答案。你是否总是急于接受有效的第一个答案,而无需等待其他人的评论?我不喜欢这个答案的原因是在C++中,你应该避免使用new和raw数组,但应该更喜欢使用vector。 boost :: shared_array 将是另一种选择,如果你真的觉得你必须使用新的。第二个机构我不特别喜欢,因为它选择一个任意大小,然后希望它适合没有任何检查任何。事实上,我不知道为什么32选择第一个街区。 – CashCow 2012-02-16 11:13:53

+0

@CashCow呃没有。给出的答案在C中是一个好的和标准的练习。你使用boost或vector 的答案是不直观的,并且(IMO)很混乱。 – adelphus 2012-02-16 11:21:15

1
char* url = new char[100]; 

您必须首先为您的char数组分配内存。

0

sup复制到url并不意味着您已初始化url
初始化url意味着为它分配内存。像这样:

url = new char[size]; 
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; 
1

如果你真的需要从一个std的内容复制焦炭:: string的的读写缓存,您可以使用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

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'在网址的结尾。

3

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

  1. 使用& - 运算符(号)

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

    string s = "hello"; 
    const char *p; 
    p = s.c_str(); 
    

我已经测试了,他们都正在努力。如果我错了,请纠正我。

+0

它可能工作时,你测试它,但第一个是有点破解,并不能保证工作。例如。如果字符串的内部表示形式是块的列表而不是单个内存块,那么当您尝试此操作时,您不会得到整个字符串。因此存在c_str()来强制字符串创建一个单独的内存块并将其零终止。 – Bryan 2012-09-15 21:06:36

+0

这是最好的解决方案。 – 2015-11-10 15:31:52