C++ 如何在c+中为char*pw分配字符串+;
如何在c中为char*pw分配字符串++ 像 char*pw=某个字符串C++ 如何在c+中为char*pw分配字符串+;,c++,C++,如何在c中为char*pw分配字符串++ 像 char*pw=某个字符串 ?对于持续初始化,您只需使用 const char *pw = "mypassword"; 如果字符串存储在变量中,并且需要复制该字符串,则可以使用strcpy()函数 如果您只想为pw分配一个字符串文字,您可以像char*pw=“Hello world”那样执行此操作 如果你有一个C++ STD::String 对象,你要分配给它的值 pW,你可以像 char *pw=StraseStry.cString()/Cut
?对于持续初始化,您只需使用
const char *pw = "mypassword";
如果字符串存储在变量中,并且需要复制该字符串,则可以使用strcpy()函数
如果您只想为
pw
分配一个字符串文字,您可以像char*pw=“Hello world”那样执行此操作代码>
如果你有一个C++ <代码> STD::String 对象,你要分配给它的值<代码> pW<代码>,你可以像<代码> char *pw=StraseStry.cString()/Cuth>那样做。但是,
pw
指向的值仅在某些\u字符串的生存期内有效。如果您指的是std::string
,则可以通过调用C\u str
从中获取指向C样式字符串的指针。但是指针必须是const
const char *pw = astr.c_str();
如果pw
指向您以前分配的缓冲区,您可能希望将字符串的内容复制到该缓冲区中:
astr.copy(pw, lengthOfBuffer);
如果以字符串文字开头,则它已经是指针:
const char *pw = "Hello, world".
请再次注意常量
——不应修改字符串文字,因为它们已编译到程序中
但是如果您在任何地方都使用std::string
,您通常会过得更好:
std::string astr("Hello, world");
顺便说一下,您需要包括正确的标题:
#include <string>
#包括
字符串必须用双引号括起来,如:
char*pStr=“stackoverflow”
它将把这个字符串文本存储在程序的只读内存中。
以后对其进行修改可能会导致UB。我想您可能需要这样做:
using namespace std;
string someString;
geline(cin,someString);
char *pw = strdup(someString.c_str());
请考虑用另一种方式做。签出(GNU Readline库)。我不知道细节,只是听说了。其他人可能会有更详细的提示或其他从标准输入读取密码的提示
如果您只想对某个对象进行一次调用,而不需要复制someString的内容,则可以直接使用someString.c_str()
,如果需要它作为const char*
一段时间后,您必须在pw
上使用free
,char*pw=“some string”;这不是您期望的吗?如果我使用like char*pw=“some string”;我有个例外。“堆的腐败”这是一个“后退一步”的问题。您不能将字符串真正“分配”给char*
,因为尽管char*
参数有时被称为“字符串参数”,但它实际上不是字符串,而是指针(指向字符串)。如果堆损坏,那么问题不在于分配,而在于分配内存的管理。最有可能的是,分配的内存中有一些您不知道的重要信息。即使这一行可以替换为一段代码片段来阻止程序崩溃,重要的是要了解整个情况;我有个例外。“堆损坏”-karthik 4秒前编辑[delete this comment]@Mac-您的代码可以工作是因为C兼容,但最好使用const char*
,因为C++11这实际上是无效的,不会编译。在C++11之前,这是一个糟糕的做法,不推荐使用。strdup
很方便,但要注意可移植性问题:你应该在文本上使用const char*pw
。在第一个示例中,我需要释放pw指针吗?如果不需要,编译器如何知道何时以及如何释放它。第一个示例不使用动态内存,因此,不需要释放任何已分配的缓冲区。只有在对某些字符串执行变异操作之前,才能保证缓冲区有效。
using namespace std;
string someString;
geline(cin,someString);
char *pw = strdup(someString.c_str());