【问题标题】:How can I properly assign a char* in c++?如何在 C++ 中正确分配 char*?
【发布时间】:2011-11-11 19:01:10
【问题描述】:

我的 c++ 代码如下所示:

char* x;
    switch(i){ 
        case 0:
            x = '0';
        case 1:
            x = "1";
        ...}

我不知道如何使它工作,因为对于第一个 x = '0'; ,编译器会抱怨:

error: invalid conversion from ‘char’ to ‘char*’

对于第二个x = "1";,编译器会抱怨:

warning: deprecated conversion from string constant to ‘char*’

我应该在这里做什么?我是不是完全错了?

【问题讨论】:

  • 我试图弄清楚如何将这些值分配给我稍后使用 strcat() 的 char*。
  • x 稍后会成为strcat 的第一个或第二个参数吗?如果它是第一个,那么在你得到这个问题的答案后,你很可能会有另一个问题。
  • 最后,我把所有东西都做成了char,然后在strcat中使用了&x,它成功了,非常感谢大家。

标签: c++ char c-strings


【解决方案1】:

首先,请找出一种可以使用std::string 的方法。如果你继续你选择的道路,你肯定会创建错误的程序。

话虽如此,这就是你的答案:你如何声明x,以及你如何分配它,很大程度上取决于你以后如何使用它。这是一个例子:

#include <stdio.h>
int main(int ac, char **av) {
  const char* x;      
  switch(ac) {
  case 0:
    x = "0";
    break;
  case 1:
    x = "1";
    break;
  default:
    x = "DANGER!";
    break;
  }
  printf("%s\n", x);
  return 0;
}

在第一个示例中,我们将指针 x 设置为指向三个可能的 const char 数组之一。我们可以稍后从这些数组中读取(如在printf 调用中),但我们永远无法写入这些数组。

或者,如果您希望创建一个数组,您可以稍后写入:

#include <stdio.h>
#include <string.h>
int main(int ac, char **av) {
  char x[32]; // make sure this array is big enough!     

  switch(ac) {
  case 0:
    strcpy(x, "0");
    break;
  case 1:
    strcpy(x, "1");
    break;
  default:
    strcpy(x, "NOT 0 nor 1:");
    break;
  }

  strcat(x, ", see?");
  printf("%s\n", x);
  return 0;
}

编辑:去掉第二个例子中不正确的const

【讨论】:

    【解决方案2】:

    这更像是一个答案,但您可以从 int 中获取字符 0, 1,...:

    char x = '0' + i;
    

    这会避免你的 switch 语句(当然是0 &lt;= i &lt;= 9)。

    【讨论】:

    • 你确定这行得通吗?它似乎对我不起作用,但也许我在其他地方有问题。
    • @weezybizzle 我几乎可以肯定这应该可行,是的。究竟是什么问题?
    • 它在程序中更靠后,我把它整理出来了。谢谢你的绝招!
    【解决方案3】:

    case 0 中,您尝试将x 设置为字符(char 类型),但在case 1 中,您尝试将x 设置为C 字符串(@987654326 类型@)。报价的类型有所不同;单引号用于字符,双引号用于 C 风格的字符串。

    如果您打算两次都将其设置为字符串,请在x = '0' 中的0 周围加上双引号。

    如果您打算将x 设置为一个字符,请两次使用单引号并取消引用指针,如*x,使其变为*x = '0',或*x = '1'或 将x 的类型从char*(指向字符的指针)更改为char(字符)。那么您不必取消引用它。1

    再一次,如果您尝试将x 设置为字符串,最好使用C++ 字符串而不是C 字符串,使用std::string。然后你会像 C 字符串那样使用双引号,但你会得到一些额外的功能,比如自动内存管理、边界检查以及它拥有的所有成员函数。

    1 正如 Nicolas Grebille 指出的那样:在这样做之前,请确保它指向一个有效的char,或者使用new

    char* x = new char;
    

    或通过在堆栈上创建char

    char c;
    char* x = &c;
    

    重要

    如果您稍后要使用char*strcat(或任何需要C 字符串的函数),您必须正确地NULL 终止您的缓冲区。所以你需要这样做:

    char x[2] = {}; // on the stack, filled with NULLs
                    // use a bigger number if you need more space
    

    char* x = new char[2]; // on the heap, use more than 2 if you're
                           // storing more than 1 character
    x[1] = NULL; // set the last char to NULL
    

    如果你不这样做,如果你不走运,你会得到垃圾;如果你幸运,你会得到一个段错误。

    那么在你像上面那样声明x之后,你可以做*x = '0'或者其他的。

    如果您决定使用new[],请确保使用相应的delete[] 释放内存。

    【讨论】:

    • 我要补充一点,要使用*x = '0',声明char * x 是不够的(请参阅下面的其他答案)。
    【解决方案4】:

    你声明了一个char指针,没有分配任何空间,然后试图给它分配一个字符。

    char x;
    

    会给你一个char类型的变量

    char *x = new char[10]; 
    

    会给你一个指向 char 指针指向的 10 字节内存的指针。

    正如上面André Caron 所指出的,由于您使用的是 c++,因此您确实应该使用实际的字符串来让您的生活更轻松

    【讨论】:

    • 并确保在分配后正确地 NULL 终止数组。
    【解决方案5】:

    如果要使用 char *,则需要通过将 x 的声明更改为以下内容来为要存储的字符串分配空间:

    char x[10]; // allocate a fixed 10-character buffer
    

    或动态分配堆上的空间:

    x = new char[10]; // allocate a buffer that must be deleted later
    

    那么你可以使用:

    strcpy(x, "1"); // Copy the character '1' followed by a null terminator
                    // into the first two bytes of the buffer pointed to by x.
    

    将字符串“1”复制到 x 指向的缓冲区中。如果您使用第二个示例,您必须稍后:

    delete x;
    

    当然,如果您真的想处理字符串,有更好的方法,也有更好的方法来处理单个字符(请参阅其他答案)。

    【讨论】:

      【解决方案6】:

      与流行的看法相反,char* 不是字符串。请改用std::string

      #include <string>
      
      std::string x;
      switch(i){ 
          case 0:
              x = "0";
          case 1:
              x = "1";
          ...}
      

      【讨论】:

      • 不错的代表数 :) 你也叫它一个字符串。所以double 可以是一个字符串,如果我们这么说的话。
      • @Seth:哈哈哈同样的次数!
      • 我只是补充一点,如果您不尝试存储字符串而是仅存储一个字符,则在此答案中将 std::string 替换为 char 并将双引号替换为单引号也可以。
      • @Seth: 在const char * x = "foo"; 中,"foo" 是一个字符串,x 指向一个以 0 字节结尾的字节块。 x 不是字符串,它是指向常量字符数组的指针。 std::string 提供真正的字符串操作。
      • @Andre meh,potayto potahto。它是 C 中的字符串,它是 C++ 中的 C 字符串。因为它是一个字符序列。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      相关资源
      最近更新 更多