Ошибка сегмента с помощью strcmp - PullRequest
0 голосов
/ 27 января 2019

У меня есть функция, которая выполняет простое математическое вычисление в зависимости от того, в какой операции мы читаем.

Символ «операция» считывается из командной строки и должен быть строкой из одного символа.

Я получаю ошибку сегмента при использовании функции strcmp.

Не уверен, почему это происходит.Может кто-нибудь помочь?Код ниже:

int syscall(int param1, int param2, char operation, int* result) 
{ 
if (param2 == 0 && (strcmp(operation, "/") == 0))
    {
        return -1; 
    }
    else if (strcmp(operation, "+") == 0)
    {
        *result = param1 + param2;
        return 0; 
    }
    else if (strcmp(operation, "-") == 0)
    {
        *result = param1 - param2; 
        return 0; 
    }
    else if (strcmp(operation, "*") == 0)
    {
        *result = param1 * param2; 
        return 0; 
    }
    else if (strcmp(operation, "/") == 0)
    {
        *result = param1 / param2; 
        return 0; 
    }
    else 
    {
        return -1; 
    }
}

Ответы [ 2 ]

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

Символ не совпадает с строкой из одного символа. strcmp ожидает символьную строку.

Должна помочь строка в параметрах.

int syscall(int param1, int param2, char operation[], int* result)
  { /* rest of code */

Но если вы сравниваете только символы, просто сравните символы и забудьте о strcmp ().

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

strcmp пытается найти размер вашей строки, и char не имеет нулевого терминатора, потому что это не строка. на самом деле вы даже не передаете адрес переменной в strcmp. вы просто задаете значение в качестве адреса, а затем strcmp пытается прочитать какой-либо адрес в диапазоне от 0 до 255.

Вы можете просто использовать:

int syscall(int param1, int param2, char operation, int* result) 
{ 
    if (param2 == 0 && operation == '/')
    {
        return -1;
    }
    else if (operation == '+')
    {
        *result = param1 + param2;
        return 0; 
    }
    else if (operation == '-')
    {
        *result = param1 - param2; 
        return 0; 
    }
    else if (operation == '*')
    {
        *result = param1 * param2;
        return 0;
    }
    else if (operation == '/')
    {
        *result = param1 / param2;
        return 0;
    }
    else 
    {
        return -1; 
    }
}
...