c ++中的字符串问题:从ctime()以int格式存储MM

问题描述 投票:0回答:1

我设计了一个程序,以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

那么,我的代码中的逻辑错误在哪里?任何帮助......

c++ string output ctime
1个回答
1
投票

那么,我的代码中的逻辑错误在哪里?任何帮助......

您的代码有一个明显的编程错误,而不是逻辑错误。在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;
}
© www.soinside.com 2019 - 2024. All rights reserved.