【发布时间】:2016-11-28 10:48:27
【问题描述】:
我正在尝试使用 read 系统调用读取输入数据。我的程序应该这样做:
- 使用 read 系统调用读取输入两个整数数据
- 对这些值求和
- 使用 write 系统调用打印输出结果
- 当第一个输入数据为-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.
-
在数组中使用地址运算符
&时应该小心。当您执行&buff时,您会得到char (*)[2]类型的东西,而不是char *的正确字符串。在读取或写入数组时,不要使用 address-of 运算符,数组自然会衰减到指向其第一个元素的指针(例如,buff传递给函数时与&buff[0]相同)。 -
最后,如果结果值超过一个数字(例如添加
6和7)怎么办?然后您的sprintf调用将超出范围,您将有未定义的行为。
标签: c linux operating-system