#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;
}