c/scanf如何处理ctrl-d、ctrl-c

c/scanf如何处理ctrl-d、ctrl-c,c,escaping,C,Escaping,让我们看一下下面的节目: # include<stdio.h> int main(void) { int status, current_number, sum=0; printf("Enter a number: "); while(status=scanf("%d", &current_number)) { sum += current_number; printf("

让我们看一下下面的节目:

# include<stdio.h>
int main(void)
{
    int status, current_number, sum=0;
    printf("Enter a number: ");
    while(status=scanf("%d", &current_number)) {
        sum += current_number;
        printf("Status: %d. The current sum is: %d. Enter another number: ", status, sum);
    }   
}
#包括
内部主(空)
{
int状态,当前_编号,总和=0;
printf(“输入一个数字:”);
while(状态=scanf(“%d”和当前_编号)){
总和+=当前_数;
printf(“状态:%d。当前金额为:%d。请输入另一个数字:”,状态,金额);
}   
}
输入一个数字:2
现状:1。目前的总数是:2。输入另一个数字:3
现状:1。目前的总数是:5。输入另一个号码:状态:-1。目前的总数是:8。请输入另一个号码:^C


CtrlD(EOF)似乎被识别为
-1
,但CtrlC jus会导致程序退出。这两个转义序列在C语言中通常是如何处理的?为什么
scanf
会对
ctrl-c
ctrl-d
进行不同的处理?

scanf函数不会以任何特殊方式处理这些字符,它甚至看不到这些字符。发生的情况是终端驱动程序(至少在类UNIX系统(a)下)截获这些击键并将其转换为特殊操作

对于CTRL-d,它会关闭标准输入文件,以便任何读取该文件的代码都会得到一个
EOF
——这就是您看到的
-1
(表示读取时出现了某种描述错误)

对于CTRL-c,它会发出
SIGINT
信号,如果该信号未捕获,将终止程序

请记住,这些是这些操作的默认键绑定,可以使用
stty
更改它们以使用不同的键绑定。默认值(
intr
eof
)如下所示(
^C
^D
):

pax>stty-a
速度38400波特;第37行;第145栏;直线=0;
intr=^C;退出=^\;擦除=^?;杀死你;eof=^D;eol=;eol2=;swtch=;开始=^Q;停止=^S;susp=^Z;
rprnt=^R;werase=^W;lnext=^V;丢弃=^O;最小值=1;时间=0;
-parenb-parodd-cmspar cs8-hupcl-cstopb cread-clocal-crtscts
-ignbrk-brkint-ignpar-parmrk-inpck-istrip-inlcr-igncr icrnl ixon-ixoff-iuclc-ixany-imaxbel-iutf8
opost-olcuc-ocrnl onlcr-onocr-onlret-ofill-ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echok-echonl-noflsh-xcase-tostop-echoprt echoctl echoke-flusho-extproc

记住,这可能不是你想要的:

while(status=scanf("%d", &current_number)) {
只有当
scanf
返回零时,循环才会退出,如果无法扫描整数(例如输入非数字的
xyzy
),则会出现这种情况。对于任何非零值,它都将继续,包括返回错误/文件结尾时的
-1

更好的循环是:

while((status = scanf("%d", &current_number)) == 1) {
事实上,由于循环应该只在状态值
1
时运行,因此使用它没有什么意义(其他用于最终决定发生了什么)。我更喜欢这样的东西:

#包括
内部主(空){
int stat,curr,sum=0;
//用户输入有效数字时提示并循环。
printf(“输入一个数字:”);
而((stat=scanf(“%d”,&curr))==1){
//累积数字求和,输出详细信息并询问下一步。
总和+=货币;
printf(“输入%d,总和为%d,输入另一个数字:”,curr,sum);
}
//最终状态-如果EOF/错误,则为1;如果无法扫描项目,则为0。
如果(统计==-1){
prinf(“\n文件类型或I/O错误。\n”);
}否则{
prinf(“非数字数据。\n”);
}
}


(a) 相比之下,Windows从内存中只将一行开头的CTRL-z(然后是ENTER)识别为文件结尾指示符。

scanf函数不以任何特殊方式处理这些字符,甚至看不到这些字符。发生的情况是终端驱动程序(至少在类UNIX系统(a)下)截获这些击键并将其转换为特殊操作

对于CTRL-d,它会关闭标准输入文件,以便任何读取该文件的代码都会得到一个
EOF
——这就是您看到的
-1
(表示读取时出现了某种描述错误)

对于CTRL-c,它会发出
SIGINT
信号,如果该信号未捕获,将终止程序

请记住,这些是这些操作的默认键绑定,可以使用
stty
更改它们以使用不同的键绑定。默认值(
intr
eof
)如下所示(
^C
^D
):

pax>stty-a
速度38400波特;第37行;第145栏;直线=0;
intr=^C;退出=^\;擦除=^?;杀死你;eof=^D;eol=;eol2=;swtch=;开始=^Q;停止=^S;susp=^Z;
rprnt=^R;werase=^W;lnext=^V;丢弃=^O;最小值=1;时间=0;
-parenb-parodd-cmspar cs8-hupcl-cstopb cread-clocal-crtscts
-ignbrk-brkint-ignpar-parmrk-inpck-istrip-inlcr-igncr icrnl ixon-ixoff-iuclc-ixany-imaxbel-iutf8
opost-olcuc-ocrnl onlcr-onocr-onlret-ofill-ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echok-echonl-noflsh-xcase-tostop-echoprt echoctl echoke-flusho-extproc

记住,这可能不是你想要的:

while(status=scanf("%d", &current_number)) {
只有当
scanf
返回零时,循环才会退出,如果无法扫描整数(例如输入非数字的
xyzy
),则会出现这种情况。对于任何非零值,它都将继续,包括返回错误/文件结尾时的
-1

更好的循环是:

while((status = scanf("%d", &current_number)) == 1) {
事实上,由于循环应该只在状态值
1
时运行,因此使用它没有什么意义(其他用于最终决定发生了什么)。我更喜欢这样的东西:

#包括
内部主(空){
int stat,curr,sum=0;
//用户输入有效数字时提示并循环。
printf(“输入一个数字:”);
而((stat=scanf(“%d”,&curr))==1){
//累积数字求和,输出详细信息并询问下一步。
总和+=货币;
printf(“输入%d,总和为%d,输入ano