Получение ошибки сегментации по функции - PullRequest
0 голосов
/ 22 января 2019

У меня есть эта функция, которая преобразует месяц из 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 голосов
/ 22 января 2019

Вы делаете что-то действительно простое в чрезвычайно сложном виде ..

Поскольку вы отметили это , вы можете просто использовать карту и вернуться путем поиска следующим образом:

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

0 голосов
/ 22 января 2019

Вы делаете это очень сложным.Упрощение решения может привести к функции, которая не выполняет никаких действий:

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