在 C++Primer 中,作者经常使用 while(cin>>word) 类似的语法,但是如何结束,可能会出现疑惑。有的时候需要两次快捷键才能结束循环,有的时候却只需要一次循环。
在 Unix 系统中的实际的现象为:
* 当输入为“字符串,回车,Ctrl+D”的时候,跳出循环;
* 当输入为“字符串,Ctrl+D,回车”的时候,不会跳出循环;
* 当输入为“字符串,Ctrl+D,回车,Ctrl+D”的时候,跳出循环;
* 当输入为“字符串,Ctrl+D,Ctrl+D”的时候,跳出循环;
在 Windows 系统中的实际现象待考察。
具体原因解释如下:
输入(cin)缓冲是行缓冲。当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin 就会检测输入缓冲区中是否有了可读的数据。
cin 还会对键盘上是否有作为流结束标志的 Ctrl+Z 或者 Ctrl+D 键按下作出检查,其检查的方式有两种:阻塞式以及非阻塞式。
阻塞式检查方式指的是只有在回车键按下之后才对此前是否有 Ctrl+Z 组合键按下进行检查,非阻塞式样指的是按下 Ctrl+D 之后立即响应的方式。如果在按 Ctrl+D 之前已经从键盘输入了字符,则 Ctrl+D的作用就相当于回车,即把这些字符送到输入缓冲区供读取使用,此时Ctrl+D不再起流结束符的作用。如果按 Ctrl+D 之前没有任何键盘输入,则 Ctrl+D 就是流结束的信号。
阻塞式的方式有一个特点:只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下。还有一个特点,如果输入缓冲区中有可读的数据则不会检测 Ctrl+Z(因为有要读的数据,还不能认为到了流的末尾)。还有一点需要知道,Ctrl+Z产生的不是一个普通的ASCII码值,也就是说它产生的不是一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区。
Windows系统中一般采用阻塞式检查 Ctrl+Z、Unix/Linux系统下一般采用非阻塞式的检查 Ctrl+D。
分享到:
相关推荐
xp系统中利用dev-cpp进行编程,语句while(cin>>str),str是个string类型,在一行中输入几个string,末位加个ctrl+z,输入没有结束,除非出入换行后,再输入ctrl+z才能跳出输入。一直不明白未什么,解释请看下。 输入...
cin >> str; while (!check(str)) { cout 输入的不是数字,请重新输入" ; cin >> str; } p1->num = atoi(str.c_str()); if (p1->num != 0) { // 输入图书价格 cout 请输入图书的价格000--以0结束;" ; ...
char keyword[][5]={"DIM","IF","DO","STOP","END"}; char str[S],id[50],s[25];... cin>>choice; while(choice!=1&&choice!=2) { cout警告 !输入不合法,重新新输入!\n"; cin>>choice; }
cin>>newnode->workplace; cout家庭电话:\n"; cin>>newnode->hometel; cout移动电话:\n"; cin>>newnode->mobiletel; newnode->next=NULL; }//if else{ Node *temp; temp=new Node; tail->...
cin>>newnode->workplace; cout家庭电话:\n"; cin>>newnode->hometel; cout移动电话:\n"; cin>>newnode->mobiletel; newnode->next=NULL; }//if else{ Node *temp; temp=new Node; tail->...
while (inData >> name >> number) { getline(inData, str); if ((sign == name) || (sign == number)) { cout 删除联系人:" ; cout << str1 ; cout (17) << left << name << "" << number << str ; flag = ...
cin >> str1 >> str2; if(str1 == str2) { cout 字符串相同" ; } else { cout 字符串不同" ; } return 0; } ``` **1478. 出现次数最多的小写字母** - **知识点**:字符串统计。本题要求找出出现次数...
std::cin >> replace; findAndReplace(input, find, replace); std::cout 请输入要插入的子串: "; std::cin >> insert; size_t pos; std::cout 请输入插入位置: "; std::cin >> pos; insertString(input, ...
cin >> str; Arithmetic(); } else if (i == 2) { cout 输入译码的数字\n"; cin >> num; decoding(); } ``` #### 三、总结 算术编码作为一种高效的压缩算法,其原理在于利用符号的出现概率来减少冗余,实现...
while (cin >> a >> b) cout ; return 0; } ``` **说明**:`scanf` 函数返回的是成功读取的数据项的数量,如果没有读取到任何数据则返回 `EOF`。 ##### 3. 多组输入数据,以特定条件结束 这种情况下,题目同样...
C++初学者,分享一下想法。 单词计数程序。 从输入流中读取单词并计数,同一个单词的大小写算一个单词,忽略常见单词。 #include #include ... while (cin >> str) { if (exclude.find(str) == exclude.en
cin>>a>>b;cout它们的最小公倍数为:"(a,b);}程序运行结果:任务二:2、设计程序,使用函数实现字符串的反转。源程序:#include<iostream.h>void reverse(char str[],int len){char temp;for(int i=0;i
该问题是关于国际象棋中的不同棋子如何在棋盘上移动。具体来说,题目要求计算从一个位置到另一个位置时,各种棋子(如王、后、车、象)需要走多少步。 **示例代码分析**: ```cpp #include<iostream> using ...
cin>>str; vstr.push_back(str); } //简单检查数据 while(num > szvstr or num ==0 ) { cout; cin>>num; } unsigned int counter = 1; counter ; int szUnsign = sizeof(unsigned int) * 8; int total...
while (inData >> name >> number) { getline(inData, str); if ((sign == name) || (sign == number)) { cout 你想删除的联系人:" << str1 (17) << "" << number << str ; flag = false; break; } ...
cin >> s.s; s.len = strlen(s.s); } ``` #### 2. 子字符串提取 接下来,通过`SubString`函数可以实现从一个字符串中提取出一个子字符串。这个函数接受原字符串`s`、需要提取的子字符串的长度`n`以及目标子字符...
cin >> str; cout (str, p, num); delete[] str; delete[] p; } ``` 主函数是程序的入口,首先通过循环获取用户想要添加的联系人数量,然后创建相应大小的`Person`对象数组,并调用`InsertPerson`函数填充数据...
cin >> str; int idx = 0; while (str[idx]) { for (int i = 0; i ; i++) { if (str[idx] == code[i]) { high = low + range * rangeHigh[i]; low = low + range * rangeLow[i]; range = high - low; ...
cin >> str; cout << "str=" << str ; cout ; *(strip + 2) = 'l'; cout << "str=" << str ; cout ; strip = new char[100]; cout ; cin >> strip; cout << "str=" << str ; cout ; } ``` 通过这些...
cin >> str; int len; len = strlen(str); char *p = &str[len - 1]; while (p >= str) { cout *p; p--; } cout ; return 0; } ``` **知识点解析**: 1. **字符串长度计算**:`strlen`函数返回字符串的...