c - 如何使用 read 系统调用读取数据输入

标签 c linux operating-system

我正在尝试使用读取系统调用读取输入数据。我的程序应该执行以下操作:

  1. 通过 read 系统调用来输入两个整数数据
  2. 对这些值求和
  3. 通过 write 系统调用打印输出结果
  4. 当第一个输入数据为-1时结束程序

这是我的代码,但不能正常工作:

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

int main(int argc,char* argv[]) {

   char buff[2];
   char buff1[2];
   char buff_w[2];

   int sum = 0, i, n = 0, val = -1, val1 = -1, n1 = 0;

   for(i = 0; i < 2; i++) {
       buff[i] = 0;
       buff1[i] = 0;
       buff_w[i] = 0;
    }

   while((n = read(0, &buff, 1)) > 0) {
      val = atoi(buff);
      if(val == -1)
         break;
      if((n1 = read(0, &buff1, 1)) >0)
         val1 = atoi(buff1);
      if(val >= 0 && val1 >= 0) {
         sum = val + val1;
         sprintf(buff_w, "%d", sum);
         write(1, &buff_w, 1);
      }    
   }

   return 0;
}

最佳答案

您的程序将无法在 while 循环中进行两次读操作。因为在两个 read 调用中,您都将从 stdin 读取。因此,在第一次读取时,您将获得整数,但在第二次读取时,您将获得下一行(\n)字符。

对于您的场景,您应该像 scanf 一样读取缓冲区中的完整字符串,然后从字符串中获取整数,然后执行您想要执行的操作。

关于c - 如何使用 read 系统调用读取数据输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40842429/

相关文章:

c - 为什么 malloc() 在使用指向 `double` 的指针时没有分配正确大小的内存?

linux - 在嵌套的 QEMU guest 中直接分配 pci 设备

c++ - 是否有用于 Windows 操作的跨平台库?

linux - 在 Linux 中,哪个组件决定在 gedit 中打开一个新窗口?

c - SIGXFSZ 运行时错误

c - 使用嵌套 if 查找四个数字中最大的一个程序

C函数只留下单链表中的唯一节点

c++ - 为什么 exec() 在 chroot() 之后不工作?

x86 - 分页和 PIC 可执行文件

c++ - 3个过程的严格交替