如何将一个字符串赋值给一个字符指针?

6
如何在C++中将字符串赋值给char指针(char*)?
char *pw = some string

1
char* pw = "some string"; 这不是你期望的吗? - Jagannath
如果我使用 char* pw = "some string"; 就会出现异常。"堆的破坏" - Anuya
1
这是一个需要“退一步”的问题。你不能真正地“给char*赋值一个字符串”,因为尽管char*参数有时被称为“字符串参数”,但它实际上不是一个字符串,而是一个指向字符串的指针。如果你遇到了堆损坏的问题,那么问题不在于赋值,而在于你对已分配内存的管理。最有可能的是,你不知道关于已分配内存的某些重要信息。即使这一行可以被替换为一个代码片段来阻止程序崩溃,重要的是要理解整个情况。 - Steve Jessop
5个回答

8

对于常量初始化,您可以简单地使用

const char *pw = "mypassword";

如果字符串存储在变量中,并且您需要创建字符串的副本,则可以使用strcpy()函数。

char *pw = new char(strlen(myvariable) + 1);
strcpy(pw, myvariable);
// use of pw
delete [] pw; // do not forget to free allocated memory

4
您应该在字面值上使用const char *pw - Notinlist
在第一个例子中,我需要释放 pw 指针吗?如果不需要,编译器如何知道何时以及如何释放它? - Borislav Stoilov
第一个示例不使用动态内存,因此无需释放任何分配的缓冲区。 - sergiom

4
如果你只想将一个字符串字面量赋值给pw,可以像这样做:char *pw = "Hello world";
如果你有一个C++ std::string对象,想要将其值赋给pw,可以这样做:char *pw = some_string.c_str()。然而,pw指向的值仅在some_string的生命周期内有效。

只有在对 some_string 执行突变操作之前,它才被保证有效。 - Bill

3

如果你指的是 std::string,你可以通过调用 c_str 方法来获取它的 C 风格字符串指针。但是,这个指针需要是 const 类型。

const char *pw = astr.c_str();

如果pw指向您之前分配的缓冲区,您可能希望将字符串的内容复制到该缓冲区中:

astr.copy(pw, lengthOfBuffer);

如果你从一个字符串字面量开始,它已经是一个指针:
const char *pw = "Hello, world".

注意再次出现的const - 字符串文字不应被修改,因为它们被编译到程序中。

但是如果您在任何地方都使用std::string,通常会更加方便:

std::string astr("Hello, world");

顺便说一下,您需要包含正确的标题:
#include <string>

3

我认为你可能想要这样做:

using namespace std;
string someString;
geline(cin,someString);
char *pw = strdup(someString.c_str());

但考虑另一种方法。看看http://tiswww.case.edu/php/chet/readline/rltop.html(GNU Readline库)。我不知道它的详细信息,只是听说过它。其他人可能有更详细或其他关于从标准输入读取密码的提示。

如果您只想为某个单独调用使用它,而无需复制someString的内容,则可以直接使用someString.c_str(),如果需要const char *,则需要使用它。

您必须在以后的某个时候使用free来释放pw


2
strdup很方便,但要注意可移植性问题:https://dev59.com/EXRB5IYBdhLWcg3w4bAo - Manuel

1

字符串必须用双引号括起来,例如:

char *pStr = "stackoverflow";

它将把这个字符串字面量存储在程序的只读内存中。 稍后修改它可能会导致未定义行为。


如果我使用 char* pw = "some string"; 就会出现异常。"堆的损坏" - karthik 4 秒前 编辑 [删除此评论] - Anuya
3
你的代码之所以能运行是因为它具有 C 兼容性,但最好使用 const char * 进行编写。 - Manuel
自从C++11以来,这是无效的代码,编译不会通过。在C++11之前,这是一种不良实践并已被弃用。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接