【问题标题】:How to read a data input with the read system call如何使用 read 系统调用读取数据输入
【发布时间】:2016-11-28 10:48:27
【问题描述】:

我正在尝试使用 read 系统调用读取输入数据。我的程序应该这样做:

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

【问题讨论】:

  • 我没有看到系统调用。只有 POSIX 函数。我们没有调试/咨询服务。请参阅How to Ask 并遵循建议。
  • atoi 函数将在失败时返回 0,而不是 -1
  • 至于你的问题,你的问题是什么?你有构建错误吗?跑的时候闪退?出乎意料的结果?请read about how to ask good questions.
  • 在数组中使用地址运算符&amp; 时应该小心。当您执行&amp;buff 时,您会得到char (*)[2] 类型的东西,而不是char * 的正确字符串。在读取或写入数组时,不要使用 address-of 运算符,数组自然会衰减到指向其第一个元素的指针(例如,buff 传递给函数时与 &amp;buff[0] 相同)。
  • 最后,如果结果值超过一个数字(例如添加67)怎么办?然后您的sprintf 调用将超出范围,您将有未定义的行为

标签: c linux operating-system


【解决方案1】:

您的程序将无法使用两个 read in while 循环。因为在两个读取调用中,您都将从标准输入读取。所以在第一次读取时你会得到整数,但在第二次读取时你会得到下一行(\n)字符。

对于您的场景,您应该像 scanf 那样在缓冲区中读取完整的字符串,然后从字符串中获取整数,然后做任何您想做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-06
    • 2023-03-08
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多