2014-02-05 46 views
-7

有没有什么办法可以把一个带引号的字符串赋给一个指针如下,没有让它变成const char*将一个非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"但我不能但找到任何解决我的问题。

CLARIFICATION:我明确指出,我正在寻找一种在所提供示例中处于简单级别的方法。我知道我可以遍历字符串并复制它,但那不是我想要的。

而对于那些困惑的delete的位置,我用它是这样的:

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

您可能意思是将字符串复制到该数组,而不是覆盖指针...... –

+0

“但我找不到任何东西来解决我的问题”。真...? strcpy ... – deviantfan

+1

即使你被允许执行该任务,并且它以某种方式创建了字符数组的可变副本,这不是'delete'的作用。你应该在你的好书中多阅读一些内容。 – molbdnilo

回答

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++的基础知识。

+3

任何人都可以解释downvote吗? – Shoe

+0

您可以通过再次阅读问题,然后查看您的答案 - 特别是您的最后一句,找到downvote的解释。 – user3140280

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; 
4

为铸造用引号的字符串到一个指针,你可以这样做: char * p =(char *)“Hello World”;

这样可以使警告消失,但是,通过这样做,您可以对编译器说谎。当你后来写信给该地区时,你会受到伤害。

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

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

您写道:

而(* P = char_01!){删除磷; p ++;}

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

+0

如果该代码没有在p [n]处释放内存,那么它做了什么?如果确实如此,它有什么问题?它如何表明对指针的工作方式缺乏了解?请解释。 – user3140280

+0

delete p将调用delete函数并尝试释放由p指向的内存,但是,取决于实现,delete p应该很可能由于完整性检查而失败,并且发现p不由其分配器/ new分配。 (注意:大多数分配器添加一个前缀元块)。此外,通过尝试检查不存在的元块,如果幸运的话,删除功能也可能触发页面错误。 –