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