繁体   English   中英

字符分配数组不起作用

[英]array of char assignment does not work

我正在尝试在switch语句中更改我的char数组[10]的值,这样,如果我们有情况1,我的char数组[10] =“ january”,或者如果我们有情况2,则array [10] =“ february”,依此类推。 问题是我收到错误消息,并且我知道我做错了什么。 任何帮助将不胜感激。 这是我用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;
} 

您不能像这样分配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超出了数组的长度)。

要快速修复,请替换:

month[10] = "January";

与:

strcpy (month, "January");

或类似strncpy的等效项,如果您是无法弄清其缓冲区应该多大的类型之一-最长的月份“ September”将很高兴地容纳十个字节:-)

前一段代码正在做的是尝试将数组偏移量10处的字符设置为该字符串,显然不可行,因为:

  1. 您无法将8个字节放入1个字节的存储桶中。
  2. 偏移量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 ,这样您就不会遇到这样的问题。

您不能将字符串文字分配给数组。 您必须改为使用strcpy()

另一种方法是使用std::string代替char数组。

当您创建"January""December"之类的字符串时,编译器将生成一个const char * ,该const char *指向一个常量字符数组,该数组的末尾为0 ,而不是character

您的代码正在尝试将"January"的地址分配给数组中的第11个元素,因为数组从0开始,所以它没有此地址。

这有两个问题,首先, month[]的元素是字符,而不是字符指针。 其次,数组从0开始,因此您希望使用month[9] ,尽管那仍然是错误的。

您要执行的操作是将每个字符复制到数组中,有些函数可以执行此操作,例如strcpy但请先使用for循环进行尝试,以使自己对正在发生的事情有更好的了解。

解决此问题的另一种方法(可能是您要遵循的方法)是将month从固定大小的字符数组更改为char * ,这样您便可以使用更早的month = "January"方法了,我更喜欢自己做,因为它只使用我需要的内存,并且语法更简洁,尽管您应该知道如何使用这两种方法。

尽管它更像是一种风格上的注释,但是如果您在专用功能中使用它,可以大大改善switch的用法:

// 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 ++风格中,您甚至可以获得const-ness的好处:

std::string const month = selectMonth(i); // note: the very same selectMonth!
            ~~~~~

const可以确保您以后不会意外修改变量,只有在可以立即对其进行初始化的情况下它才起作用,这需要一个小的函数来完成。 善良会带来善良:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM