我正在攻读考试,我对Unix中的规范与非规范输入/输出的工作原理感到困惑(例如,curses).我知道有一个缓冲区,"行规则"应用于规范输入.这是否意味着缓冲区被旁路用于非规范输入,还是仅仅意味着没有应用线路规则?输入和输出操作的这个过程有何不同?
在我使用的curses程序中演示了规范输入,用户输入的输入是在键入一定数量的字符或经过一定时间后自动输入的.这些事情中的任何一个都被视为"线条学科"还是完全不同于其他事情?
我面对的是一些我无法解释的事情.除了举例外,没有更好的解释方式:
#include <stdio.h>
int main ()
{
char c;
while (1) {
c = getchar();
printf("%x\n", c);
}
return(0);
}
Run Code Online (Sandbox Code Playgroud)
如果我执行此命令,它只是以这种方式无限迭代:
$ echo -n "A" | ./binary
41
ffffffff
ffffffff
ffffffff
ffffffff
...
Run Code Online (Sandbox Code Playgroud)
从我所知道的和我读(混乱有关的getchar()循环内部是如何工作),我以为echo -n "A"会发A到标准输入,然后触发EOF 事件(我不知道什么EOF真的是)一次,因此我的循环最多迭代两次,然后等待stdin中的新输入.
但不,它迭代EOF,我不明白为什么.
我运行此命令试图理解:
$ echo -n "A" | strace ./binary
read(0, "A", 4096) = 1
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffff7ff6000
write(1, …Run Code Online (Sandbox Code Playgroud) 这是添加字母数字字符串中的数字的代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int total=0;
char ch;
printf("enter the string\n");
ch=getchar();
while(ch!='\0')
{
printf("I am here !!");
if (!(isalpha(ch)))
total+=(int)ch;
ch=(char)getchar();
printf("I am here !!");
}
printf("\ntotal is %d",total);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
无论我输入什么字符,它都会为每个字符提供4个"我在这里".
我试着用
while((ch=getchar())!='\0');
Run Code Online (Sandbox Code Playgroud)
但它给出了同样的问题.