вычислить значение выражения в строке
Посчитать арифметическое выражение из строки.
Не понимаю, как выделить из строки число. Если его выделю, то приведу его к типу double при помощи atof.
UPD: Написал код, который работает в целом правильно. Но, хотелось бы исключить ситуации, когда 1) В начале (до считывания числа) есть операнды (плюс или факториал); 2) Между любыми двумя операндами нет числа (т.е. нет ситуаций типа !!, ++, !+, +! с точностью до пробелов). Буду благодарен, если дадите идею для этого. Код:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
int check(FILE* fin){
char c;
while((c = fgetc(fin)) != EOF){
if((c != ' ') && (c != '+') && (c != '!') && (c != '.') && (isdigit(c) == 0)){
perror("Incorrect data!");
return -1;
}
}
rewind(fin);
return 0;
}
int length(FILE* fin){
int i = 0;
while(fgetc(fin) != EOF){
i++;
}
rewind(fin);
return i;
}
double fact(double a){
int tmp = 1;
if(((int) a) != a){
perror("Can't calculate factorial of a real number!");
return -1;
}
else if(a == 0){
return 0;
}
else{
for(int i = 1; i <= ((int) a); i++){
tmp *= i;
}
return tmp;
}
}
double Process(char* str){
double res = 0;
double tmp = 0;
while(*str){
res += strtod(str, NULL);
tmp = strtod(str, NULL);
while(((*str != '!') && (*str != '+')) && *str) str++;
if(*str == '!'){
if(fact(tmp) == -1){
return -1;
}
else{
res-=tmp;
res+=fact(tmp);
*str++;
}
}
else if(*str == '+'){
*str++;
}
}
return res;
}
int main(void){
FILE* fin;
char* str;
int len;
double res = 0;
if((fin = fopen("input.txt", "rt")) == NULL){
perror("Can't open input.txt");
return -1;
}
if(check(fin) != 0){
fclose(fin);
return -1;
}
len = length(fin);
if(len <= 0){
perror("Incorrect length!");
fclose(fin);
return -1;
}
if((str = (char*) malloc(len * sizeof(char) + 1)) == NULL){
perror("Memory wasn't allocated!");
fclose(fin);
return -1;
}
if(fgets(str, len+1, fin) == NULL){
perror("Can't read string!");
free(str);
fclose(fin);
return -1;
}
res = Process(str);
if(res == -1){
return -1;
}
printf("%lf", res);
fclose(fin);
free(str);
return 0;
}
Источник: Stack Overflow на русском