如何在c ++中正确分配char *?

时间:2011-09-07 02:09:30

标签: c++ char c-strings

我的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*’

我该怎么办?我完全错了吗?

6 个答案:

答案 0 :(得分:4)

case 0您尝试将x设置为字符(类型为char),但在case 1中您尝试设置x到一个C字符串(类型为char const[2])。引号的类型有所不同;单引号用于字符,双引号用于C风格的字符串。

如果您有意将其设置为字符串两次,请在0的{​​{1}}周围加上双引号。

如果您要将x = '0'设置为某个字符,请同时使用单引号并取消引用指针,例如x,以使其变为*x或{{1 },*x = '0'的类型从*x = '1'(指向字符的指针)更改为x(字符)。然后你不必取消引用它。 1

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

1 正如Nicolas Grebille所指出的那样:在此之前,请确保使用x指向有效的std::string

char

或在堆栈上创建new

char* x = new char;

重要

如果您稍后将charchar c; char* x = &c; 一起使用(或任何期望使用C字符串的功能),必须正确char*终止你的缓冲区。所以你需要这样做:

strcat

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'取消分配内存。

答案 1 :(得分:3)

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

#include <string>

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

答案 2 :(得分:2)

如果您要使用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;

当然,如果你真的想要处理字符串,那么有更好的方法,并且有更好的方法来处理个别字符(参见其他答案)。

答案 3 :(得分:2)

这是一个答案的评论,但你可以从int得到字符01,...:

char x = '0' + i;

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

答案 4 :(得分:1)

您声明了char 指针,没有分配任何空格,然后尝试为其分配一个字符。

char x;

会为您提供char

类型的变量
char *x = new char[10]; 

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

如上面的André Caron所述,由于您使用的是c ++,因此您应该使用实际字符串来简化生活

答案 5 :(得分: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