使用系统调用时输入年龄30,if语句未输出,请求排查原因
问题原因及修复方案
你的代码存在三个核心问题,直接导致if语句无法执行:
错误1:误解
read函数的返回值read返回的是实际读取到的字节数,不是你输入的年龄数值。比如输入30再按回车,实际读取到'3'、'0'、'\n'三个字符,共3个字节,变量a的值为3,显然3>21不成立,if分支不会触发。错误2:缓冲区定义错误
char *buffer[BUFFSIZE];是指针数组,内部元素都是未初始化的野指针,直接传入*buffer给read会引发内存访问错误(未定义行为)。正确写法应该是定义字符数组:char buffer[BUFFSIZE];。错误3:未将输入字符串转为整数
输入的年龄以字符串形式存于缓冲区,你需要先把它转换成整数,再和21做比较,而非用读取的字节数判断。
修复后的代码示例
#include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <stdlib.h> // 用于atoi函数 #define BUFFSIZE 512 int main() { int age; char buffer[BUFFSIZE]; // 改为字符数组 write(1, "Please Enter your age: ", 23); // 读取输入到缓冲区,第二个参数为buffer而非*buffer ssize_t bytes_read = read(0, buffer, BUFFSIZE - 1); if (bytes_read > 0) { // 去掉输入末尾的换行符 buffer[bytes_read - 1] = '\0'; // 将字符串转为整数 age = atoi(buffer); if (age > 21) { write(1, "You are an adult", 16); } } return 0; }
额外说明
read的返回值类型是ssize_t,比int更适合表示字节数,能区分出错和读取到0的情况。atoi转换非法数字时会返回0,可根据需求添加输入验证逻辑。- 读取时预留一个字节给字符串结束符
'\0',避免缓冲区溢出。
内容的提问来源于stack exchange,提问作者Noobies
相关产品推荐
相关产品推荐

