我试图在switch语句中更改我的char数组[10]的值,这样,如果我们有case 1,我的char数组[10] =" january"或者如果我们有情况2,然后数组[10] =" 2月"等等。问题是我得到错误信息,我知道我做错了什么。任何帮助将非常感激。这是我用Dev-C ++编写的switch语句。
char month[10];
switch (i)
{
case 1:
month[10]="January";
cout<<month<<endl;
break;
case 2:
month[10]="February";
cout<<month<<endl;
break;
}
答案 0 :(得分:5)
您无法分配char
这样的数组,您需要使用strcpy
。
或者更好的是,使用std::string
,这是C ++的事情。
std::string month;
switch (i)
{
case 1:
month="January";
cout<<month<<endl;
break;
case 2:
month="February";
cout<<month<<endl;
break;
}
或者你必须坚持char[]
:
char month[10];
switch (i)
{
case 1:
strcpy(month,"January");
cout<<month<<endl;
break;
case 2:
strcpy(month,"February");
cout<<month<<endl;
break;
}
您收到错误的原因是month[10]
是char
,而您正在尝试为其分配const char*
,这是非法的。 (实际上它是未定义的行为,因为10超出了数组的长度)。
答案 1 :(得分:2)
要快速解决问题,请替换:
month[10] = "January";
使用:
strcpy (month, "January");
或像strncpy
这样的等价物,如果你是那些无法弄清楚缓冲区应该有多大的类型之一 - “九月”,最长的一个月,将很乐意适应十个字节: - )
前一段代码正在尝试将数组的偏移量10处的字符设置为该字符串,显然不可行,因为:
当然,在代码中不会消耗这么多行的替代方法可能是:
static char *months[] = { "January", "February", ..., "December" };
if ((i < 1) or (i > 12))
strcpy (month, "?");
else
strcpy (month, months[i-1]);
cout << month << endl;
对于正确的修复,请停止在C ++代码中使用C风格的字符串。 C ++的设计者投入大量精力提供std::string
只是为了让你不会遇到这样的问题。
答案 2 :(得分:1)
您无法将字符串文字指定给数组。您必须改为使用strcpy()
。
另一种方法是使用std::string
代替char
数组。
答案 3 :(得分:1)
当您创建"January"
或"December"
之类的字符串时,编译器会生成const char *
,该0
指向一个在结尾处具有"January"
的常量字符数组整数而不是字符。
您的代码正在尝试将month[]
的地址分配给数组中的第11个元素,因为数组从0开始,所以它没有。
这有几个问题,首先,month[9]
的元素是字符,而不是字符指针。其次,数组从0开始,因此您希望使用strcpy
,尽管这仍然是错误的。
你要做的是将每个字符复制到数组中,有些函数像for
那样执行,但首先尝试使用month
循环来让自己更好地理解是什么继续。
另一种解决此问题的方法,可能就是你要追求的方法是将char *
从固定大小的字符数组更改为month = "January"
,这样你可以使用前面的方法{{1}}我希望自己喜欢这样做,因为它只占用了我需要的内存,语法更清晰,但你应该知道如何做两种方法。
答案 4 :(得分:1)
虽然它更像是一种风格,但如果你在专门的功能中使用它,你的开关使用会得到很好的改善:
// Using C-string
char const* selectMonth(int i) {
switch(i) {
case 1: return "January";
case 2: return "February";
...
}
assert(0 && "This is impossible!");
}
然后你可以很容易地使用它:
char month[10];
strcpy(month, selectMonth(i));
通常,您会发现使用小函数有助于使代码更具可读性。在真正的C ++风格中,你甚至可以获得稳定的优点:
std::string const month = selectMonth(i); // note: the very same selectMonth!
~~~~~
这个const
将确保您之后不会意外地修改变量,它只有在您可以立即初始化它时才有效,这需要一个小功能来完成这项工作。善良会产生善意:)