【问题标题】:How to copy a char* to a char in c++如何在 C++ 中将 char* 复制到 char
【发布时间】:2011-03-30 19:51:03
【问题描述】:

我一直在用 c++ 解决一个问题,但我陷入了困境。 这是一个很长的代码,但我只会在我现在卡住的地方发布一小部分。在这里;

char* x = (char*)malloc(sizeof(char));
char y = (char)malloc(sizeof(char));
y = *x;

问题是当我这样做时,如果 X 指向一个名为“HELLO”的字符,当我打印 y 时它只打印“H”字母。

我想将 char* 的整个单词复制到一个 char 变量中。我也不知道字符的大小,因为它们是由用户给出的。所以长度可以是任何东西。我尝试了 strcpy() 但无法解决问题。

任何帮助表示赞赏。

**感谢所有cmets。现在我决定根据您的 cmets 使用 std::string 。我想我再也不会使用 malloc 了。现在我必须回到代码并根据字符串更改所有内容并检查是否一切正常。

【问题讨论】:

  • 如果这是 C++,你应该在尝试 malloc() 之前学习 std::string。
  • 如果这真的是 C++,你可能不应该使用 malloc 而你可能应该使用 std::string 类型。
  • 不要在 C++ 中使用 mallocfree - 查看 newdelete 进行内存管理。
  • 关于编辑:当有人忘记#include <string> 时,MSVC++ 上通常会看到“没有运算符匹配这些操作数”。另外,你不应该new ifstream,它只是ifstream inFile("C:\\Temp\\AAA.txt");
  • @Cubbi,我发现我忘记了 并在任何 cmets 之前添加了它。但是根据您的评论,我尝试了 ifstream inFile("C:\\Temp\\AAA.txt");但它给出了错误。新的有什么问题,如果完全错误,我怎么能像你说的那样写。

标签: c++ copy char


【解决方案1】:

套用 Inigo Montoya 的话说,我认为这段代码并不像您认为的那样。

malloc(sizeof(char))

这会分配一定数量的内存。分配多少内存由malloc 的参数决定。在这种情况下,您传递的是sizeof(char),根据定义,它正好是一个字节。因此,您分配了一个字节的内存。

如果你坚持使用malloc(稍后会详细介绍),那么你应该做的是弄清楚你想要存储的字符串有多长,为NULL终止符添加一个字节,然后malloc那么多。对于 13 个字符的字符串 Hello, world.,对应的调用是:

malloc(14)

下一步:

char y = (char)malloc(sizeof(char));

malloc 返回一个指向它为你分配的内存的指针。 y 在这种情况下不是一个指针,它只是一个 char。两者不一样。它编译并显示可以工作,因为您使用了被称为 C 样式转换的工具:(char)malloc(...)。这告诉编译器,“我知道我把枪指着我的脚。只要按照我告诉你的去做,不要抱怨。”它尽职尽责。但你做错事有几个原因:

  1. malloc 返回一个指针,但您试图将其转换为 char
  2. 您只分配了 1 个字节,但您假设您分配了整个字符串的内存价值
  3. y 只是一个 char,但您将其视为一个完整的字符串。

所以如果你再次坚持使用malloc,你需要做这样的事情:

static const char* HELLO = "Hello, malloc.";

char* x = malloc(strlen(HELLO)+1);
strcpy(x, HELLO);
char* y = malloc(strlen(x)+1);
strcpy(y, x);

但是,您根本不应该在 C++ 中使用 malloc。相反,您应该使用std::string:

std::string x = "Hello, string.";
std::string y = x;

这样更好,因为:

  1. strings 管理自己的内存。您不会像在代码中那样泄漏内存。
  2. string 是类型安全的。当您将返回值从 malloc 转换为 char 时,您违反了类型安全。你可以这样做,但不是char。那很糟。 string不会让你不费吹灰之力就这样开枪。
  3. 代码更少。最好的代码是你从未编写过的代码。

【讨论】:

  • 不会 strlen() 有时会失败,因为您没有以空值终止您的 char 字符串吗?
  • @0A0D:假设“失败”是指“做错事”,肯定是这样。因此,我上面代码中的所有字符串都是以 NULL 结尾的。
  • 由于代码变得不安全,不能假设它是空终止的建议。
  • @0A0D:更好的经验法则是知道什么是安全假设,什么不是。如果我断言 "Hello, string." 保证以 NULL 结尾,这是一个安全的假设。
  • 如果你这么说。 PCI 不会告诉你下次你必须遇到安全审计的时候。
【解决方案2】:

它不应该 - 它应该崩溃,实际上它甚至可能不应该编译!

char y = (char)malloc(sizeof(char)); 这行没有意义

malloc 保留一些内存,然后返回一个指向该内存的指针 - 您不能将指针分配给非指针变量,例如 'y'

同样在第一行中,您要求 malloc 为单个字符、sizeof(char)=1 保留内存,而不是用户输入的字符数。

【讨论】:

  • 正确,虽然我要补充一点,它不会编译,因为malloc 返回void *,所以将其转换为char 肯定会失败。
  • 同意。它的意思是“分配内存的单个字符”,然后将所述内存指针转换为一个字符,除掉地址的低 8(16?)位之外的所有位。
  • FWIW,malloc 函数返回一个指针。 OP 将指针变量分配给 char 变量。但是,从malloc 转换返回值会阻止编译器报告错误。
  • 虽然是真的,但不是很有帮助。
  • @Thomas - 令人惊讶的是,任何编译器都会让您将 void* 强制转换为 char 而不提及它!
【解决方案3】:

您不能将整个单词放入char 变量中,因为char 类型只包含一个字符。由于标准 C 中没有 string 类型,因此需要使用字符数组来表示字符串。

此外,malloc 函数只返回一个指针,因为您尝试分配的内存位于堆上的某个位置。没有办法 (*) 动态地增大或缩小堆栈以包含可变长度值。

(*) 标准 C 中没有办法,尽管使用不可移植的非标准函数有一些空间。

【讨论】:

    【解决方案4】:

    首选std::string

    因为 C 风格的字符串使用指针,所以不能使用赋值 (operator=) 来复制它们。

    您必须使用strxxx 系列函数,例如strcpy 进行复制。 请记住在复制之前为接收方分配内存。

    【讨论】:

      【解决方案5】:

      关于这段代码的一切都是错误的。第一行为一个字符分配空间,并将地址存储在 x 中。它拥有多个角色而不会崩溃的事实是纯粹的运气。第二行更糟糕,因为它为一个字符分配空间,然后将地址转换为单个字符。

      它应该看起来更像这样: char x=(char) malloc(sizeof(char)*sizeOfYourString); char y=(char) malloc(sizeof(char)*sizeOfYourOtherString);

      strcpy(x, y);

      【讨论】:

        猜你喜欢
        • 2010-12-03
        • 2013-08-20
        • 1970-01-01
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多