湛蓝之海 发表于 2021-12-29 12:18:40

《C++杂记》循环终止输入方式(Ctrl+Z,Ctrl+C,Ctrl+D(EOF))



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,需要判断出现的位置。






https://blog.51cto.com/u_11512283/4855180
页: [1]
查看完整版本: 《C++杂记》循环终止输入方式(Ctrl+Z,Ctrl+C,Ctrl+D(EOF))