c++ cin 作为while条件(详解)

本文一切测试在windows clion中进行

在clion中,ctrl +z并不是文件结束符

在cmd中运行,只需要ctrl+z再加回车就可以得到正确结果

1、cin

cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。

在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。

cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。

使用一个istream的对象作为条件时,效果是检查流的状态。若流有效,则检测成功,返回true。当遇到文件结束符或者无效的输入(比如用一个字符来作为一个整型数的输入时),istream的对象状态会变为无效。

总而言之:

(1)  输入数据时需要敲回车键才能将数据送到缓存器,cin才能读取缓存区的数据。

(2) 当cin遇到文件结束符(windows中为:ctrl +Z , Unix 中为:ctrl +D),或无效输入才能使cin状态无效。

一下这段测试代码将说明以上问题。

代码作用: 统计输入值中数据连续出现的次数。

因为无法判断输入数据的个数,所以无法采用一个定值来控制循环次数。这里我们使用cin来作为if 条件:

#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main() {

  cout << "Enter a list of integers:" << std::endl;
  int currVal = 0;
  int val = 0;
  int cnt = 0;

  /*读入第一个输入的数据*/
  if ( cin >> currVal ){
    cnt = 1;
    /*循环读入之后的数据*/
    while( cin >> val ){
      /*如果当前读入的数据val与之前的数据currVal相等,cnt++*/
      if (currVal == val) {
        ++cnt;
      } else {
        /*如果不相等,输出之前数据currVal连续出现的次数,同时重新统计当前数据的连续出现次数*/
        cout << currVal << " occurs " << cnt << " times. " << endl;
        currVal = val;
        cnt = 1;
      }
    }
     /*打印最后一个数据的连续出现次数*/
    cout << currVal << " occurs " << cnt << " times. " << endl;
  }
  return 0;
}

(1)控制台输入 1 2 3 4 5 6 7加回车:

7的统计并没有显示,因为这个时候我们只是将数据push到了缓冲区,while中的cin读取到7,流的检测状态是true,所以并没有退出循环,还在等待下一个输入数据,不能执行while循环之外的代码,因此不能打印最后下一个数据7。

(2)控制台输入 1 2 3 4 5 6 7加ctrl+D:

直接以ctrl+d结束数据,数据1到7没有提交到缓冲区,而if中的cin直接读取到文件结束符,流状态检测为false,if中的代码不能执行,直接结束程序运行。

(3)控制台输入1 2 3 4 5 6 7加回车:

再输入ctrl+D:

1到6的输出如(2)中所述,等我们再次输入文件结束符号时,cin流状态为false,结束while循环,因此执行while循环之外的代码,打印出最后一个数据7 的统计次数。

(4)控制台输入1 2 3 4 5 6 7 t 加回车:

我们输入1到7和t之后,再enter,将数据push到缓冲区。在while循环的条件中,cin逐个读入到val中,再执行循环体中的代码,最后读到t时,企图将字符存入到int型的变量中,无效输入导致流状态为false,种植while循环,可以打印出最后一个数据的统计信息。

以上这篇c++ cin 作为while条件(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C++编程中用put输出单个字符和cin输入流的用法

    用C++流成员函数put输出单个字符 在程序中一般用cout和插入运算符"<<"实现输出,cout流在内存中有相应的缓冲区.有时用户还有特殊的输出要求,例如只输出一个字符.ostream类除了提供上面介绍过的用于格式控制的成员函数外,还提供了专用于输出单个字符的成员函数put.如: cout.put('a'); 调用该函数的结果是在屏幕上显示一个字符a.put函数的参数可以是字符或字符的ASCII代码(也可以是一个整型表达式).如 cout.put(65 + 32); 也显

  • C/C++字符串函数之复制函数详解

    突然发现对字符串函数缺乏系统的了解,所以花了一点时间专门整理下,在此记录之,以方便自己及有需要的人使用. C/C++字符串函数的头文件:string.h 复制函数主要有4个,如下: 1.char * strcpy(char* destination,const char * source); 2.char* strncpy(char* destination,const char* source,size_t num); 3.void * memcpy(void* destination,con

  • C/C++字符串查找函数全面了解

    C/C++ string库(string.h)提供了几个字符串查找函数,如下: memchr 在指定内存里定位给定字符 strchr 在指定字符串里定位给定字符 strcspn 返回在字符串str1里找到字符串str2里的任意一个字符之前已查找的字符数量 strrchr 在字符串里定位给定字符最后一次出现的位置 strpbrk 在字符串str1里定位字符串str2里任意一个首次出现的字符 strspn 返回字符串str1从开始字符到第一个不在str2中的字符个数 strstr 在字符串str1中

  • 浅谈c++中的while(cin)问题

    xp系统中利用dev-cpp进行编程,语句while(cin>>str),str是个string类型,在一行中输入几个string,末位加个ctrl+z,输入没有结束,除非出入换行后,再输入ctrl+z才能跳出输入.一直不明白未什么,解释请看下. 输入缓冲是行缓冲.当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储.每当按下回车键后,cin.get()   就会检测输入缓冲区中是否有了可读的数据.cin.get()   还会对键盘上是否有作为流结束标志的   Ctrl+Z 

  • C++对cin输入字符的判断及分段函数处理方法示例

    本文实例讲述了C++对cin输入字符的判断及分段函数处理方法.分享给大家供大家参考,具体如下: 这两个本来也不是什么问题,然而真正遇到还是有地方可以研究的.首先是C++对于cin输入的判断,有时候你定义了一个整形,然后就是有些人就喜欢给你乱输个字符串进去,你必须处理一下,这里不像Java用抛出异常处理用户输入,也不像JavaScript用isNaN来判断,对此可参考前面的一篇<JavaScript对数字的判断与处理实例分析>.C++是用cin.fail()来判断. 至于分段函数的处理,比如要你

  • C,C++中常用的操作字符串的函数

    小小的做一个总结 函数名: stpcpy 功 能: 拷贝一个字符串到另一个,遇到'\0'时停止拷贝,destin要有足够大的空间 用 法: char *stpcpy(char *destin, char *source);   函数名: strcat 功 能: 字符串拼接函数,注意,destin要有足够大的空间 用 法: char *strcat(char *destin, char *source); 函数名: strchr 功 能: 在一个串中查找给定字符的第一个匹配之处,找不到返回NULL

  • 解析C++中的字符串处理函数和指针

    C++字符串处理函数 字符串连接函数 strcat 其函数原型为 strcat(char[],const char[]); strcat是string catenate(字符串连接)的缩写.该函数有两个字符数组的参数,函数的作用是:将第二个字符数组中的字符串连接到前面字符数组的字符串的后面.第二个字符数组被指定为const,以保证该数组中的内容不会在函数调用期间修改.连接后的字符串放在第一个字符数组中,函数调用后得到的函数值,就是第一个字符数组的地址.例如: char str1[30]=″Peo

  • 基于C++ cin、cin.get()、cin.getline()、getline()、gets()函数的使用详解

    1.cin 2.cin.get() 3.cin.getline() 4.getline() 5.gets() 6.getchar() 附:cin.ignore();  cin.get()//跳过一个字符,例如不想要的回车,空格等字符 1.cin>>          用法1:最基本,也是最常用的用法,输入一个数字: #include <iostream> using namespace std; main () {    int a,b;    cin>>a>&g

  • C++处理键盘输入的方法

    本文实例讲述了C++处理键盘输入的方法,可实现简单处理键盘输入,分享给大家供大家参考.具体实现方法如下: 需要响应WM_CHAR消息: 复制代码 代码如下: #include <string> static std::string str; 在wm_char中: 复制代码 代码如下: str = str + char(wParam);  ::InvalidateRect(hWnd, NULL, 0);  return 0; 在wm_paint中: 复制代码 代码如下: case WM_PAIN

  • c++中cin/cout与scanf/printf的区别比较

    cin .cout 基本说明: cin代表标准输入设备,使用提取运算符 ">>" 从设备键盘取得数据,送到输入流对象cin中,然后送到内存. cin是输入流,cout是输出流,重载了">>"."<<"运算符,包含在头文件<iostream>中. 先把要输出的东西存入缓冲区,再输出,导致效率降低,cin是自动判断你的变量类型,比如一个char数据只能用默认的char方法取数据. scanf .prin

  • C++的字符串分割函数的使用详解

    经常碰到字符串分割的问题,这里总结下,也方便我以后使用. 一.用strtok函数进行字符串分割 原型: char *strtok(char *str, const char *delim); 功能:分解字符串为一组字符串. 参数说明:str为要分解的字符串,delim为分隔符字符串. 返回值:从str开头开始的一个个被分割的串.当没有被分割的串时则返回NULL. 其它:strtok函数线程不安全,可以使用strtok_r替代. 示例: //借助strtok实现split #include <st

随机推荐