获取功能上的细分错误

时间:2019-01-22 13:45:49

标签: c++ segmentation-fault

我有此功能,可以将一个月从3个字符转换为2位数的月:

int Extract_Month(char *pDestMonth, char *pMonth)
{
    char monthschar[12][4] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" };
    char monthsdigit[12][3] = { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12" };
    int i = 0;

char tmpStr[4] = "";
tmpStr[0] = (pMonth[0] >= 'a' && pMonth[0] <= 'z') ? ('a' + pMonth[0] - 'A') : pMonth[0];
tmpStr[1] = (pMonth[1] >= 'a' && pMonth[1] <= 'z') ? ('a' + pMonth[1] - 'A') : pMonth[1];
tmpStr[2] = (pMonth[2] >= 'a' && pMonth[2] <= 'z') ? ('a' + pMonth[2] - 'A') : pMonth[2];
tmpStr[3] = 0;

for (i = 0; i < 12; i++)
{
    if (!strncmp(tmpStr, monthschar[i], 3))
    {
        StrMove((uchar *)pDestMonth, (uchar *)monthsdigit[i], 2);
        return 0;
    }
}
return -1;
}

我正在用gdb运行它,但遇到了分段错误错误。有人知道我在这里想念什么吗?

我进行了一些研究,发现段错误是由于内存处理不当引起的。

gdb输出完全指向此函数声明

这是调用函数的地方(精简代码): enter image description here

2 个答案:

答案 0 :(得分:5)

您正在以一种极其复杂的方式使事情变得非常简单。

自从将其标记为以来,您就可以使用地图并通过如下查找返回:

std::string Extract_Month_As_Digits(const std::string& month)
{
  static std::map<std::string, std::string> monthToDigit = {{"JAN", "01"}};//omitted init.
  auto found = monthToDigit.find(month);
  return found  != monthToDigit.end() ? *found : "";
}

如果您希望由于错误的输入/查找引发异常,则可以将其减少为return monthToDigit.at(month);

答案 1 :(得分:1)

您正在使其变得非常复杂。简化解决方案可能会导致函数不起作用:

int month_index(const char *threeDigitMonth) {
    static const char *names[] = {"JAN", "FEB", NULL};
    const char** name = names;
    while(name && strcmp(threeDigitMonth, *name)){ ++name; }
    return name - names;
}

现在,您的问题减少到将int转换为两位数的字符串,snprintf很有能力。

或者您可以使用C ++:

auto month_index(const std::string& threeDigitMonth) {
  static const std::unordered_map<
     std::string, std::string> months = {{
       {"JAN", "01"},
       {"FEB", "02"},
       ...
    }};
    return months.at(threeDigitMonth);
  }