我设计了一个程序,以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()
输出是
星期一3月25日15:25:11 2019
因此,Mmm = 3月
因此Convert_M()
的输出应为3
但是,上面的代码给出了它的输出:
MM=13
那么,我的代码中的逻辑错误在哪里?任何帮助......
那么,我的代码中的逻辑错误在哪里?任何帮助......
您的代码有一个明显的编程错误,而不是逻辑错误。在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
定义为指向char的指针,但指针未初始化,您继续取消引用它并将值分配给内存位置。未初始化的指针具有未确定的值,它可以指向任何产生未定义行为的位置。
你可以做的是定义一个char数组并将其第一个地址传递给你的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;
}