Проблема со строками в c : для сохранения MM в формате int из ctime ()

#c #string #output #ctime

#c #строка #вывод #ctime

Вопрос:

Я разработал программу, которая будет сохранять текущий месяц в 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(amp;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. Компилируется ли ваш код вообще? *strM не инициализируется. Кроме того, strM должна указывать на нулевую завершающую строку, но это не так. Вот почему strcmp работает некорректно.

2. В ваших тегах и заголовке указано C , но этот код выглядит как код на C.

3. @KonradRudolph Как ты можешь такое говорить? Я использовал, cout который определен в разделе <iostream.h> доступно только в c … не так ли?

4.@Suresh О, я пропустил cout . Но будьте осторожны, этого iostream.h не существует. Похоже, вы используете очень устаревший компилятор. Современные компиляторы не приняли бы этот код.

Ответ №1:

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

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

 int main ()
{
  time_t t;

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

  str = ctime (amp;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() функции. Таким образом, инициализируется указатель, который указывает на адрес первого элемента массива, и вы получите ожидаемый результат от функции. Измените свой main следующим образом и увидите, что проблема исправлена.

 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 (amp;t);

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

  M = Convert_M (strM);

  cout << "MM=" << M;

  getch ();

  return 0;
}