не работает массив назначения символов - PullRequest
0 голосов
/ 14 марта 2012

Я пытаюсь изменить значение моего массива char [10] в операторе switch так, чтобы, если у нас был случай 1, мой массив char [10] = "январь" или, если у нас был случай 2, то массив[10] = "февраль" и так далее.Проблема в том, что я получаю сообщение об ошибке, и я знаю, что я делаю что-то не так.любая помощь будет очень признательна.вот мой оператор switch, написанный на Dev-C ++.

char month[10];
switch (i)
{
 case 1:
       month[10]="January";
      cout<<month<<endl;
      break; 
 case 2:
       month[10]="February";
      cout<<month<<endl;
      break;
} 

Ответы [ 5 ]

5 голосов
/ 14 марта 2012

Вы не можете назначить 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 превышает длину массива).

2 голосов
/ 14 марта 2012

Для быстрого исправления замените:

month[10] = "January";

с:

strcpy (month, "January");

или эквивалент, такой как strncpy, если вы один из тех типов, которые не могут понять, насколько большими должны быть их буферы - "сентябрь", самый длинный месяц, вполне сгодится в десяти байтах :-)

То, что делает предыдущий фрагмент кода, пытается установить символ со смещением 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, чтобы у вас не возникало подобных проблем.

1 голос
/ 14 марта 2012

Хотя это более стилистическая нота, использование переключателя может быть значительно улучшено, если вы используете его в специализированных функциях:

// 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 гарантирует, что вы случайно не измените свою переменную впоследствии, он будет работать, только если вы сможете немедленно инициализировать его, чтотребуется небольшая функция, чтобы сделать работу.Добро порождает добро :)

1 голос
/ 14 марта 2012

Когда вы создаете строки, такие как "January" или "December", компилятор генерирует const char *, который указывает на постоянный массив символов с 0 в конце целое число, а не символ .

Ваш код пытается присвоить адрес "January" 11-му элементу в массиве, которого у него нет, потому что массивы начинаются с 0.

Это парапроблемы, во-первых, элементы month[] являются символами, а не символьными указателями.Во-вторых, массивы начинаются с 0, поэтому вы хотели использовать month[9], хотя это все равно было бы неправильно.

Что вы хотите сделать, это скопировать каждый символ в массив, есть функции, которые делают это, например, strcpy, но попробуйте сначала с помощью цикла for, чтобы лучше понять, что происходитon.

Еще один способ решения этой проблемы, и, вероятно, ваш путь - это изменить month с массива символов фиксированного размера на char *, чтобы вы могли использовать ранееметод month = "January" это то, как я бы предпочел сделать это сам, потому что он использует только столько памяти, сколько мне нужно, а синтаксис чище, хотя вы должны знать, как использовать оба метода.

1 голос
/ 14 марта 2012

Вы не можете присвоить строковый литерал массиву.Вместо этого вам придется использовать strcpy().

Альтернативный способ - использовать std::string вместо char array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...