c++ 中的字符串问题:从 ctime() 以 int 格式存储 MM
String issue in c++ : to store MM in int format from 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(&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" 和 returns 其等效的 int
形式,
例如:
今天是 25/03/2019 ,
所以 ctime()
输出是
2019 年 3 月 25 日星期一 15:25:11
因此,Mmm= Mar
因此 Convert_M()
的输出应该是 3
但是,以上代码的输出为:
MM=13
那么,我的代码中的逻辑错误在哪里?任何帮助...
So, where is the logical error in my code? any help...
您的代码没有逻辑错误,而是存在明显的编程错误。在 main()
函数中,赋值 strM[i] = str[4 + i];
会导致未定义的行为,并且很可能会导致内存损坏(分段 fault/crash)。
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 的指针,但该指针未初始化,您继续取消引用它并将值分配给内存位置。未初始化的指针具有未确定的值,它可能指向任何产生未定义行为的地方。
您本可以做的是定义一个字符数组并将其第一个地址传递给您的 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 (&t);
for (i = 0; i < 3; i++)
strM[i] = str[4 + i];
M = Convert_M (strM);
cout << "MM=" << M;
getch ();
return 0;
}
我设计了一个程序,它将以 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" 和 returns 其等效的 int
形式,
例如:
今天是 25/03/2019 ,
所以 ctime()
输出是
2019 年 3 月 25 日星期一 15:25:11
因此,Mmm= Mar
因此 Convert_M()
的输出应该是 3
但是,以上代码的输出为:
MM=13
那么,我的代码中的逻辑错误在哪里?任何帮助...
So, where is the logical error in my code? any help...
您的代码没有逻辑错误,而是存在明显的编程错误。在 main()
函数中,赋值 strM[i] = str[4 + i];
会导致未定义的行为,并且很可能会导致内存损坏(分段 fault/crash)。
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 的指针,但该指针未初始化,您继续取消引用它并将值分配给内存位置。未初始化的指针具有未确定的值,它可能指向任何产生未定义行为的地方。
您本可以做的是定义一个字符数组并将其第一个地址传递给您的 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 (&t);
for (i = 0; i < 3; i++)
strM[i] = str[4 + i];
M = Convert_M (strM);
cout << "MM=" << M;
getch ();
return 0;
}