char赋值数组不起作用

时间:2012-03-14 07:37:03

标签: c++ arrays char switch-statement

我试图在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;
} 

5 个答案:

答案 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处的字符设置为该字符串,显然不可行,因为:

  1. 您不能将8个字节装入1个字节的存储桶中。
  2. 无论如何,偏移量10 超出数组的末尾。
  3. 当然,在代码中不会消耗这么多行的替代方法可能是:

    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将确保您之后不会意外地修改变量,它只有在您可以立即初始化它时才有效,这需要一个小功能来完成这项工作。善良会产生善意:)