评论

收藏

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

编程语言 编程语言 发布于:2021-12-29 12:18 | 阅读数:700 | 评论:0



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)
DSC0000.png

【注】在终止程序之前需要先回车在按Ctrl+Z,才能进行终止。
运行环境:Ubuntu14.04+ g++(Ctrl+D)
DSC0001.png


 输入数字
#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):
DSC0002.png

结果2(用Ctrl+D):
DSC0003.png

结果3(用Ctrl+Z):
DSC0004.png

运行环境:Ubuntu14.04+ g++(Ctrl+D)
结果1(用EOF):
DSC0005.png

结果2(用Ctrl+D):
DSC0006.png


 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)
DSC0007.png

运行环境:Ubuntu14.04+ g++(Ctrl+D)
DSC0008.png

代码不复杂,只有在键盘输入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,需要判断出现的位置。






关注下面的标签,发现更多相似文章