2016-10-19 5 views
-1

Я использую два файла, которые отправляют, а другой получает символ, использующий каналы, и он работает нормально, но я хочу знать, как после получения сообщения я хочу преобразовать этот символ в целые числа и добавить или вычесть на основе что находится на символе.Как я могу добавить два числа из char в C?

В принципе, как я могу разобрать «3 + 4» на 7?

Вот мой write.c

#include <fcntl.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main() 
{ 
int fd; 
char * myfifo = "/tmp/myfifo"; 

/* crear FIFO */ 
mkfifo(myfifo, 0666); 

/* escribir al FIFO */ 
fd = open(myfifo, O_WRONLY); 
write(fd, "3+4", sizeof("3+4")); 
close(fd); 

/* remover FIFO */ 
unlink(myfifo); 

return 0; 
} 

И это мой read.c

#include <fcntl.h> 
#include <stdio.h> 
#include <sys/stat.h> 
#include <unistd.h> 

#define MAX_BUF 1024 

int main() 
{ 
int fd; 
char * myfifo = "/tmp/myfifo"; 
char buf[MAX_BUF]; 

/* open, read, and display the message from the FIFO */ 
fd = open(myfifo, O_RDONLY); 
read(fd, buf, MAX_BUF); 
printf("Received: %s\n", buf); 
close(fd); 

return 0; 
} 
+1

Я подозреваю, что это не очень хорошо, если вы вызываете 'write (fd, «3 + 4», sizeof («3 + 4»)); вместо 'write (...., strlen (" 3 + 4 "));' –

+0

Пожалуйста, отформатируйте/отступы свой код. –

+0

и покажите нам, что у вас до сих пор пытались разобрать полученное сообщение. –

ответ

1

если это только о добавлении 2 номера (задницы противоположности общего калькулятора цели) почему бы не просто отправьте «3,4»

Теперь разделите строку на «,». Подсказка - используйте strchr

Теперь преобразуем две подстроки в целые числа. Подсказка использовать atol

Теперь добавьте их. Подсказка: +

0

Вам нужно разобрать строку, чтобы получить арифметические выражения. Как уже отмечали комментаторы, такой вопрос здесь слишком широк, потому что есть много способов сделать это, в зависимости от того, насколько сложны выражения. Для простого сложения/вычитания двух положительных целых чисел - не более чем s1 + s2 или s1 - s2, не отрицание или что-либо другое - вы можете использовать этот очень простой пример:

#include <stdio.h> 
#include <stdlib.h> 

// ALL CHECKS OMMITTED! 

#define ADD 1 
#define SUB 2 

int parse(char *s) 
{ 
    int op1 = 0, op2 = 0, res = 0, operator= 0, next = 0; 
    for (;;) { 
    switch (*s) { 
     case '0': 
     case '1': 
     case '2': 
     case '3': 
     case '4': 
     case '5': 
     case '6': 
     case '7': 
     case '8': 
     case '9': 
     // may over/underflow, check! 
     if (next == 0) { 
      op1 *= 10; 
      op1 += *s - '0'; 
     } else if (next == 1) { 
      op2 *= 10; 
      op2 += *s - '0'; 
     } 
     break; 
     case '+': 
     operator = ADD; 
     next = 1; 
     break; 
     case '-': 
     operator = SUB; 
     next = 1; 
     break; 
     case '\0': 
     // may over/underflow, check! 
     if (operator == ADD) { 
      res = op1 + op2; 
     } else if (operator == SUB) { 
      res = op1 - op2; 
     } 
     break; 
     default: 
     // just ignore everything else for now 
     break; 
    } 
    if(*s == '\0'){ 
     break; 
    } 
    s++; 
    } 
    return res; 
} 

int main() 
{ 
    char *s = "3 + 4"; 
    printf("%s = %d\n",s, parse(s)); 
    s = "3 - 4"; 
    printf("%s = %d\n",s, parse(s)); 
    exit(EXIT_SUCCESS); 
} 

И хотя он является очень простой и не очень удобный, он уже довольно сложный. Вы можете расширить его - в некоторой степени - но вы достигнете предела довольно быстро.

Если у вас есть не более чем строка арифметических операций, вам может потребоваться некоторое время, чтобы найти такие вещи, как например: «parse infix expressions» или аналогичные здесь и в другом месте. Первый хит в Google - это страница Википедии о Shunting-Yard algorithm, которая должна дать вам хорошее начало. Это довольно интересный материал, но ничего не нужно всего лишь на половину вечера.

Смежные вопросы