我正面对一段我不理解的代码:
read(fileno(stdin),&i,1);
switch(i)
{
case '\n':
printf("\a");
break;
....
我知道fileno
会在此返回与sdtin
相关联的文件描述符,然后read
将此值放入i
变量。
那么,stdin
允许i
与第一个“案例”相匹配的价值是什么,\n
?
谢谢
答案 0 :(得分:2)
但是stdin的值应该与第一个“case”相匹配,即\ n?
case语句不会查看stdin的“值”。
read(fileno(stdin),&i,1);
将单个字节读入i
(假设read()
调用成功),如果该字节为\n
(换行符),那么它将匹配大小写。您可能需要阅读read(2)
的手册页以了解它的作用。
答案 1 :(得分:0)
我知道
fileno
返回与此处sdtin
相关联的文件描述符,
是的,虽然我怀疑你不知道这意味着什么。
然后
read
将此值放入i
变量。
没有。不不不不不。 read()
不会将文件描述符的值或其任何部分放入提供的缓冲区(在您的情况下,为i
的字节)。顾名思义,read()
尝试读取文件 ,该文件描述符作为第一个参数传递。读取的字节(如果有)存储在提供的缓冲区中。
stdin
代表程序的标准输入。如果从交互式shell运行程序,那将与您的键盘对应。该程序尝试读取用户输入,并将其与换行符进行比较。
该程序可能存在缺陷,也许是完全错误的,尽管从所呈现的片段中无法分辨出来。如果i
是int
类型的变量,则其表示大于一个字节,但您只读取一个字节。这将只替换表示的一个字节,结果取决于C实现和读取的数据。
该程序似乎可以尝试使用read()
,但我建议改为使用getchar()
:
#include <stdio.h>
/*
...
int i;
...
*/
i = getchar();
/* ... */