我的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*’
我该怎么办?我完全错了吗?
答案 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;
重要强>:
如果您稍后将char
与char 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得到字符0
,1
,...:
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
。