如何在C语言中使用read()系统调用从标准输入读取整数值?
如何用read()系统调用从标准输入读取整数值?
你的代码输出异常的核心问题是read()系统调用读取的是原始二进制字节,不会自动将输入的文本字符转换为整数。
问题分析
你输入的54是ASCII字符,对应的字节是0x35('5')和0x34('4')。而int类型通常占4字节,read()会把这两个字节和另外两个补全的空字节(0x00)一起写入变量n。在小端字节序的系统中,这些字节会被组合成0x00003435,转换成十进制就是668725,也就是你看到的输出。
正确实现方式
因为标准输入默认是文本模式,用户输入的是字符形式的数字,所以需要先读取文本字符串,再转换成整数。以下是可行的实现:
#include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> int main(){ char buf[16]; // 读取输入的文本,预留一个字节给字符串终止符 ssize_t bytes_read = read(0, buf, sizeof(buf)-1); if(bytes_read > 0){ // 添加字符串终止符,确保后续字符串函数能正常工作 buf[bytes_read] = '\0'; // 移除输入末尾的换行符(如果存在) buf[strcspn(buf, "\n")] = '\0'; // 将字符串转换为整数 int n = atoi(buf); printf("[%d]\n", n); } return 0; }
补充说明
如果一定要直接用read()读取二进制整数,那需要输入的是对应整数的二进制字节(比如通过其他程序输出二进制数据到标准输入),但这不是常规的交互式输入场景,不适合从键盘读取整数的需求。
内容的提问来源于stack exchange,提问作者Suchitra Mahato
相关产品推荐
相关产品推荐

