将非const引用的字符串分配给char *?

时间:2014-02-05 16:24:07

标签: c++ pointers cstring

有没有办法将引用的字符串分配给指针,如下所示,没有将其转换为const char*

char** p;
*p=new char[100];
*p="quoted_string\n";

以上问题是p现在是const字符串,我无法delete阻止它:

delete p[n]; //gives an error--- block_is_valid...

我知道L"string"之类的字符串文字,但我无法找到解决问题的方法。

澄清:我明确表示我正在寻找一种简单的方法,该方法在所提供的示例中存在。我知道我可以遍历字符串并复制它,但这不是我正在寻找的。

对于那些对delete的位置感到困惑的人,我会用它来做这样的事情:

while(*p!=char_01) //this is not an example to be taken literally
{delete p; p++;}

3 个答案:

答案 0 :(得分:6)

使用std::string

std::string p;
p = "quoted_string\n";

然后您可以使用以下方法删除角色:

p.erase(p.begin() + n);

代码的问题在于:

char* p;
p=new char[100];
p="quoted_string\n";

通过忘记动态分配的指针泄漏100字节内存。此外,delete不应用于从C风格的字符串中删除字符。

我还建议你进一步前往read a book,因为你似乎缺乏C ++的基础知识。

答案 1 :(得分:5)

C ++:

#include <string>
...
std::string str = "quoted_string\n";

可能的C式方法:

char str[] = "quoted_string\n";

请注意,这些是任何好书中涵盖的基础知识:The Definitive C++ Book Guide and List
另请注意,L"string"并非您认为的那样。看看string literals


带有动态分配缓冲区的丑陋C风格解决方案( !!!你真的不想这样做!!! ):

#include <cstring>
...
char* str = new char[100];                // destination buffer
const char* src = "quoted_string\n";      // pointer to constant string literal
strcpy(str, src);                         // strlen(src) must be <= 99 
...
delete[] str;

答案 2 :(得分:4)

要将带引号的字符串转换为指针,您可以执行以下操作: char * p =(char *)“Hello World”;

这使警告无声,但是这样做会让你骗到编译器。当你以后写信给那个地区时,你会被咬住。

要了解这是多么严重的错误,您需要了解大多数工具链默认将文字字符串放在可执行文件的只读部分(.rodata)上,该区域以只读方式映射,并写入该文件region导致保护错误,默认终止应用程序。因此,为了防止人为错误,编译器非常适合为此生成警告。

如果您完全知道自己在做什么,可以告诉链接器将该文字字符串放在可写部分,或者尝试-fno-const-strings。

您写道:

  

while(* p!= char_01){delete p;的p ++;}

现在我看到对指针,字符串和删除如何工作缺乏了解。 如果你想操作字符串,使用字符串类更容易,你可以使用自己喜欢的搜索引擎获得大量的教程。