鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 阳间祝福

[已解决]如何让程序一次读一个字符且不需要按下回车就能执行

[复制链接]
 楼主| 发表于 2022-8-14 12:03:45 | 显示全部楼层
人造人 发表于 2022-8-14 07:19
"就算我输入“asdf”,read(0, buf, 1) 读到 buf 里后,调用 write(1, buf, 1) 却输出了 “asdf” 而不是我 ...
  1. #include <unistd.h>
  2. #define BUFFER_SIZE 1

  3. int main() {
  4.     ssize_t read(int fd, void *buffer, size_t count);
  5.     void *buf[BUFFER_SIZE];
  6.     while (read(0, buf, 1) != 'Q')
  7.         write(1, buf, 1);
  8.     return 0;
  9. }
复制代码


就。。。写得很糙,这里我 BUFFER_SIZE 设成 1 了,还是能读很多,刚才以为是需要对齐到 4 或 8字节的原因,但我试了下,输入“asdfa;lkasjdfasj;gkdasf"也能返回
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 12:07:16 | 显示全部楼层
阳间祝福 发表于 2022-8-14 12:03
就。。。写得很糙,这里我 BUFFER_SIZE 设成 1 了,还是能读很多,刚才以为是需要对齐到 4 或 8字节 ...

这个程序不就是输入什么输出什么吗?
一直while循环读取字符,不是 'Q' 就把这个字符输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 12:10:10 | 显示全部楼层
阳间祝福 发表于 2022-8-14 12:03
就。。。写得很糙,这里我 BUFFER_SIZE 设成 1 了,还是能读很多,刚才以为是需要对齐到 4 或 8字节 ...

还有,你的buf多少个字节了?
  1. $ cat main.c
  2. #include <stdio.h>
  3. #include <unistd.h>

  4. #define BUFFER_SIZE 1

  5. int main() {
  6.     //ssize_t read(int fd, void *buffer, size_t count);
  7.     void *buf[BUFFER_SIZE];
  8.     printf("%lu\n", sizeof(buf));
  9.     /*
  10.     while (read(0, buf, 1) != 'Q')
  11.         write(1, buf, 1);
  12.     */
  13.     return 0;
  14. }
  15. $ gcc-debug -o main main.c
  16. $ ./main
  17. 8
  18. $
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 12:13:24 | 显示全部楼层
阳间祝福 发表于 2022-8-14 12:03
就。。。写得很糙,这里我 BUFFER_SIZE 设成 1 了,还是能读很多,刚才以为是需要对齐到 4 或 8字节 ...

等一下,read函数的返回值是什么?
读取到的这1个字符?
那如果是这样呢?
read(0, buf, 2)
返回读取到的两个字符?
你把read函数的返回值和 'Q' 比较是什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-14 12:19:03 | 显示全部楼层
人造人 发表于 2022-8-14 12:13
等一下,read函数的返回值是什么?
读取到的这1个字符?
那如果是这样呢?

emm当时想错了,read 返回的是 读的个数,不应该这么写,这里我只是想实现:不按回车就能读进去然后输出来,现在看是需要操作一下 ICANON ,而不是简单地 read 设只读 1 个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-14 12:27:02 | 显示全部楼层
人造人 发表于 2022-8-14 12:10
还有,你的buf多少个字节了?

这里第 10 行 打印的是 buf 指针的大小吧?

我刚才试了一下,输入很长的串也可以,是不是因为它不检查越界什么的?

  1. cat read_one.c
  2. #include <unistd.h>
  3. #include <stdio.h>

  4. int main() {
  5.     ssize_t read(int fd, void *buffer, size_t count);
  6.     char buf[3];
  7.     printf("size: %d\n", sizeof(buf));
  8.     while (read(0, &buf, 1) != 0)
  9.         write(1, &buf, 1);
  10.     return 0;
  11. }
  12. size: 3
  13. as;dlfkj;slakdjf;lksaj;lkjd;lkwejodijaskc;
  14. as;dlfkj;slakdjf;lksaj;lkjd;lkwejodijaskc;
  15. as;dlkfj;lkjg;sldkjg;lksdfvmkldsmvldskf;glkjsd;lkfjg;kerstj;lewrkj
  16. as;dlkfj;lkjg;sldkjg;lksdfvmkldsmvldskf;glkjsd;lkfjg;kerstj;lewrkj
  17. ^C
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 12:40:03 | 显示全部楼层
阳间祝福 发表于 2022-8-14 12:27
这里第 10 行 打印的是 buf 指针的大小吧?

我刚才试了一下,输入很长的串也可以,是不是因为它不检查 ...

  1. void *buf[1];
复制代码

buf是什么?
buf是一个数组,数组里面有一个元素,元素的类型是 void *
1 * sizeof(void *)
1 * 8 = 8


你这个程序在做什么?
这个程序不就是输入什么输出什么吗?
输入一个字符,输出一个字符,一直循环

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 12:42:58 | 显示全部楼层
输入一个字符,输出一个字符,一直循环
你的buf有3个字节的空间,怎么会溢出呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-14 12:43:55 | 显示全部楼层
人造人 发表于 2022-8-14 12:40
buf是什么?
buf是一个数组,数组里面有一个元素,元素的类型是 void *
1 * sizeof(void *)

是的,这个程序就是输入什么输出什么,只不过我在输入之后得按回车才会输出,所以我就好奇能不能不按回车就输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 12:46:54 | 显示全部楼层
阳间祝福 发表于 2022-8-14 12:43
是的,这个程序就是输入什么输出什么,只不过我在输入之后得按回车才会输出,所以我就好奇能不能不按回车 ...

"是不是因为它不检查越界什么的?"
什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-14 12:56:23 | 显示全部楼层
人造人 发表于 2022-8-14 12:42
输入一个字符,输出一个字符,一直循环
你的buf有3个字节的空间,怎么会溢出呢?

哦哦这是不是说,我在控制台输入”asdfasdf" 并按下回车的时候,发生的是这样的事情:while 循环 8(还是 9)次,第一次读 'a', 存到 buf[0] 处,然后紧接着调 write,把 'a' 写出来,然后再读 'b' , 存到 buf[0](还是 buf[1]?) ,再调 write 写出来,以此类推?是这样理解的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 13:00:21 | 显示全部楼层
把 'a' 写出来,然后再读 'b' , 存到 buf[0](还是 buf[1]?)
是存到 buf[0]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-14 13:03:49 | 显示全部楼层
人造人 发表于 2022-8-14 13:00
把 'a' 写出来,然后再读 'b' , 存到 buf[0](还是 buf[1]?)
是存到 buf[0]

啊啊,原来如此,这么一看 我刚才什么越界什么的发言是什么迷惑发言。。

谢谢!我有点明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 22:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表