Я впервые задаю вопрос о переполнении стека, поэтому, пожалуйста, потерпите меня
Я пытаюсь создать калькулятор в c как проект, но получаю ошибку сегментации при оценке алгебраического выражения во второй раз с использованием библиотеки python внутри c с использованием Python.h
Сначала я использовал оценочная функция, непосредственно предоставленный интерпретатором python, но после прочтения о почему eval может быть опасен я использовал библиотеку python с именем NumExpr, как было предложено здесь, но когда я использую эту библиотеку python для оценки алгебраического выражения, я получаю ошибку сегментации при вводе второго выражения время (работает в первый раз)
Вот пример кода:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <Python.h>
void my_pause()
{
int c;
printf("\n Press the enter key to continue...");
fflush(stdout);
while ((c = getchar()) != '\n' && c != EOF) {}
}
void main()
{
char selec[8], temp;
while(1)
{
main:
printf("Enter here : ");
scanf("%s" , selec);
scanf("%c" , &temp); //this scanf is necessary as it solves the input buffer
if (strcmp(selec,"math-exp")==0)
{
printf("\n\n Please note the opreators : ");
printf("\n for addition '+'");
printf("\n for subtraction '-'");
printf("\n for multiplication '*'");
printf("\n for division '/'");
printf("\n for exponential power '**'");
printf("\n for percentage '%%'");
printf("\n for knowing about various functions that can be used please check documentation");
//I had to print this using printf and not by python print itself is to solve the EOL error
printf("\n\n Enter the mathematical expression : ");
Py_Initialize();
PyRun_SimpleString("import numexpr as ne");
PyRun_SimpleString("math_exp = input()");
//I had to print this using printf and not by python print itself is to solve the EOL error
printf("\n The answer is : ");
fflush(stdout);
PyRun_SimpleString("print(math_exp)");
Py_Finalize();
my_pause();
system("clear");
goto main;
}
else if (strcmp(selec,"exit")==0)
{
exit(0);
}
}
}
Это отлично работает в первый раз, но если вы введете «math-exp» во второй раз, чтобы ввести другое выражение, это покажет ошибку сегментации. Я использую linux mint, gcc 9.4.0, python 3.8. Ниже приведена команда, которую я использую для компиляции кода:
gcc test.c -o test.bin -I"/usr/include/python3.8" -L"/usr/lib/python3.8" -lpython3.8
Заранее спасибо за помощь!
В дополнение к предыдущему комментарию: char selec[8];
слишком мал, чтобы содержать строку "math-exp"
, для которой требуется не менее 9 символов (8 для текста + 1 для завершающего нуля).
Что ж, спасибо, что помогли мне с этим, но моя главная проблема все еще не решена.
Многократный вызов Py_Finalize
приводит к утечке памяти. Просто переместите строку Py_Finalize
перед exit(0)
Эта ошибка была обнаружена в 2007 году и закрыта только в прошлом месяце. https://bugs.python.org/issue1635741
Решено в питоне 3.11.
Спасибо, это работает отлично для меня, но вызовет ли это какие-либо другие проблемы?
Если вы не используете несколько потоков Python, я так не думаю.
Хорошо, тогда это работает для меня, так как я использую только один поток Python, большое спасибо
Не зацикливайтесь на буфере, который готов переполниться при первом же чихе.
char selec[8]; scanf("%s" , selec);
==>char selec[100]; scanf("%99s" , selec);
.