ctrl-c 发送 SIGINT 信号给前台进程组中的所有进程。常用于终止正在运行的程序。
ctrl-z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程。
ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。
接下来笔者通过不同的例子来说明这些组合键的差异。
字符串输入#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
vector<string> a;
string tmp;
while (cin>>tmp){
a.push_back(tmp);
}
for (vector<string>::iterator iter = a.begin(); iter != a.end(); ++iter){
cout << *iter << endl;
}
return 0;
} 结果:
运行环境:Windows + DEV-C++(Ctrl+Z)
【注】在终止程序之前需要先回车在按Ctrl+Z,才能进行终止。
运行环境:Ubuntu14.04+ g++(Ctrl+D)
输入数字#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
vector<int> a;
int tmp;
while (cin>>tmp){
a.push_back(tmp);
}
for (vector<int>::iterator iter = a.begin(); iter != a.end(); ++iter){
cout << *iter << endl;
}
return 0;
} 结果:
运行环境:Windows + DEV-C++
结果1(用EOF):
结果2(用Ctrl+D):
结果3(用Ctrl+Z):
运行环境:Ubuntu14.04+ g++(Ctrl+D)
结果1(用EOF):
结果2(用Ctrl+D):
Ctrl+C:
直接就终止程序了(程序和输入string的那个一样)。
字符统计
在前面讲解了结束的条件,那么统计字符有事如何呢?在K&R的C语言教程里关于输入字母计数的程序,如下:#include<stdio.h>
int main(int argc, char *argv[])
{
long coff=0;
while(getchar()!=EOF)
coff++;
printf("%ld\n",coff);
return 0;
} 结果:
运行环境:Windows + DEV-C++(Ctrl+Z)
运行环境:Ubuntu14.04+ g++(Ctrl+D)
代码不复杂,只有在键盘输入EOF键时,循环才会结束。
那么如何才能从键盘输入EOF呢?(我的编程环境是 windows 10 + DEV-C++),在Windows 下,输入 Ctrl+z 或者F6 键是可以代表EOF的,
例如输入 “abcd^z 回车” 时,程序还在继续,继续后在新的一行输入 “^z 回车” 时,程序才结束,输出5。
如果输入 “abcdZZ^Z 回车 ^Zefg 回车” , 还是输出5。这说明:
第一行内的三个ZZ^Z并没有算三次;
第二行开头的^Z后面三个字母efg 并没有计算到coff里,也就是说,程序运行到了接收字母e 时,已经跳出了循环
abcd 四个字母,再加一次回车,所以输出是5 (如果中间输入两次回车,也就是“abcdZZ^Z 回车 回车 ^Zefg 回车”时,输出是6,就说明)
while循环遇到^Z开头的新的一行就结束了,无论后面有多少字母,这些输入的字母都没有影响到coff的值
总结一下就是系统用了一个很不常用的键盘组合产生的消息值,来代表EOF,然后是否认定为EOF,需要判断出现的位置。
|