1

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

我应该在这里做什么?我会完全错了吗?

4

6 回答 6

4

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

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

如果您打算设置x为字符,请使用单引号并取消引用指针,例如*x,使其变为*x = '0',或*x = '1'将类型xchar*(指向字符的指针)更改为char(字符)。然后你不必取消引用它。1

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

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

char* x = new char;

char或通过在堆栈上创建一个:

char c;
char* x = &c;

重要

如果您稍后要使用char*with 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[].

于 2011-09-07T02:12:51.773 回答
3

与流行的看法相反,char*它不是一个字符串。改为使用std::string

#include <string>

std::string x;
switch(i){ 
    case 0:
        x = "0";
    case 1:
        x = "1";
    ...}
于 2011-09-07T02:11:35.643 回答
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;

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

于 2011-09-07T02:17:47.793 回答
2

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

char x = '0' + i;

这将避免您的 switch 语句(0 <= i <= 9当然)。

于 2011-09-07T02:33:56.860 回答
1

您正在声明一个char 指针,而不是分配任何空间,然后尝试为其分配一个字符。

char x;

会给你一个类型的变量char

char *x = new char[10]; 

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

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

于 2011-09-07T02:18:10.540 回答
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;
}

In this first example, we set the pointer x to point to one of three possible const char arrays. We can read from those arrays later (as in the printf call), but we can never write to those arrays.

Alternatively, if you wish to create an array you can later write to:

#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;
}

EDIT: Get rid of incorrect const from 2nd example.

于 2011-09-07T02:48:11.770 回答