如何从C中的char添加两个数字?

时间:2016-10-19 15:37:53

标签: c char int pipe fifo

我正在使用两个正在发送的文件,另一个正在使用管道接收字符并且它工作正常但我想知道在收到消息之后我想如何转换整数中的字符并添加或减去基础关于什么是炭。

基本上我怎样才能将“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;
}

2 个答案:

答案 0 :(得分:1)

如果这只是添加2个数字(屁股反对通用计算器),为什么不发送“3,4”

现在将字符串拆分为“,”。提示 - 使用strchr

现在将两个子串转换为整数。提示使用atol

现在添加它们。提示使用+

答案 1 :(得分:0)

您必须解析字符串以获取算术表达式。正如评论者已经说过的那样:这里的问题有点过于宽泛,因为有很多方法可以做到,这取决于表达式的复杂程度。对于两个正整数的简单加法/减法 - 不超过s1 + s2s1 - s2,没有否定或其他任何东西 - 您可以使用此非常简单示例:< / p>

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

虽然它 非常简单且使用不多,但它已经非常复杂了。你可以扩展它 - 在某种程度上 - 但你会很快达到极限。

如果你只有一行算术运算,你可能需要一些时间来查找例如:“解析中缀表达式”或类似的地方和其他地方。谷歌的第一个热门话题是关于Shunting-Yard algorithm的维基百科页面,这应该会给你一个良好的开端。这是非常有趣的东西,但只有半个晚上才能学习。