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", ¤t_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", ¤t_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", ¤t_number)) {
只有当scanf
返回零时,循环才会退出,如果无法扫描整数(例如输入非数字的xyzy
),则会出现这种情况。对于任何非零值,它都将继续,包括返回错误/文件结尾时的-1
更好的循环是:
while((status = scanf("%d", ¤t_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", ¤t_number)) {
只有当scanf
返回零时,循环才会退出,如果无法扫描整数(例如输入非数字的xyzy
),则会出现这种情况。对于任何非零值,它都将继续,包括返回错误/文件结尾时的-1
更好的循环是:
while((status = scanf("%d", ¤t_number)) == 1) {
事实上,由于循环应该只在状态值1
时运行,因此使用它没有什么意义(其他用于最终决定发生了什么)。我更喜欢这样的东西:
#包括
内部主(空){
int stat,curr,sum=0;
//用户输入有效数字时提示并循环。
printf(“输入一个数字:”);
而((stat=scanf(“%d”,&curr))==1){
//累积数字求和,输出详细信息并询问下一步。
总和+=货币;
printf(“输入%d,总和为%d,输入ano