Строковая проблема в c ++: хранить MM в формате int из ctime () - PullRequest
0 голосов
/ 25 марта 2019

Я разработал программу, в которой текущий месяц будет храниться в формате int, где текущий месяц задается с ctime();
. При этом я сталкиваюсь с проблемами, когда не отображается правильный месяц на экране вывода,
Мой исходный код для вышеуказанной программы выглядит следующим образом:

int main()
{
 time_t t;
 char *str,*strM;    // Pointer str to store output from ctime()
 //Pointer strM to store month in Mmm format
 int i,M;    //M to store the int equivalent of strM
 t=time(NULL);
 str=ctime(&t);
 for(i=0;i<3;i++)
  strM[i]=str[4+i];
 M=Convert_M(strM);
 cout<<"MM="<<M;
 getch();
 return 0;
}
int Convert_M(char *strM)
{
 char *s[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug",
        "Sep","Oct","Nov","Dec"};
 int i;
 for(i=0;i<12;i++)
 {

  if((strcmp(strM,s[i]))==0)
  {
   break;
  }
 }
 return (i+1);
}

В приведенном выше коде Convert_M() принимает строку "Mmm" и возвращает ее эквивалентную форму int, например,
.:
Сегодня 25/03/2019,
, поэтому ctime() вывод
Пн 25 марта 15:25:11 2019
, следовательно, Mmm = Mar
и, следовательно, вывод Convert_M() должно быть 3

, но приведенный выше код выдает результат в виде:

MM=13

Итак, где же логическая ошибка в моем коде?любая помощь ...

1 Ответ

1 голос
/ 25 марта 2019

Итак, где же логическая ошибка в моем коде? любая помощь ...

Вместо логических ошибок в вашем коде есть очевидная программная ошибка. В функции main() назначение strM[i] = str[4 + i]; вызывает неопределенное поведение и, скорее всего, приведет к повреждению памяти (ошибка сегментации / сбой).

int main ()
{
  time_t t;

  char *str, *strM;
  int i, M;
  t = time (NULL);

  str = ctime (&t);

  for (i = 0; i < 3; i++)
    strM[i] = str[4 + i];

  M = Convert_M (strM);

  cout << "MM=" << M;

  getch ();

  return 0;
}

В приведенном выше коде вы определяете strM как указатель на символ, но указатель не инициализируется, и вы продолжаете разыменовывать его и присваивать значения ячейкам памяти. Неинициализированный указатель имеет неопределенное значение, он может указывать на любое место, приводящее к неопределенному поведению.

Вместо этого вы могли бы определить массив символов и передать его первый адрес вашей функции convert_M(). Таким образом, указатель, который указывает на адрес первого элемента массива, инициализируется, и вы получите ожидаемый результат от функции. Измените ваш основной способ следующим образом и посмотрите, как проблема будет исправлена.

int
main ()
{
  time_t t;

  char *str;
  char strM[4]{0}; // creates an array, 0 initialize it
  int i, M;
  t = time (NULL);

  str = ctime (&t);

  for (i = 0; i < 3; i++)
    strM[i] = str[4 + i];

  M = Convert_M (strM);

  cout << "MM=" << M;

  getch ();

  return 0;
}
...