C++中cin的用法汇总

cin可以用于接收输入,最常见的是从控制台接收。在刚学习C++的时候经常会用cin来接收数据,这里想要系统的总结一下cin的用法,保证不灌水。

C++中的cin是一个 istream对象,从标准输入中读取数据,在iostream头文件中定义。

流对象不能拷贝或赋值。此外,读写一个IO对象都会改变其状态,因此传递和返回的引用都不能是const的,否则无法读写。

cin的条件状态

IO流有四种条件状态,分别用位来控制。

  • cin.badbit : 001   1   表示系统级错误,一旦被置为该状态,流就无法再使用了
  • cin.eofbit :  010    2   表示流已经读完,到达尾部了
  • cin.failbit:   100    4     可恢复错误,如期望读取数值却读出一个字符等错误,或者已经到达流的尾部
  • cin.goodbit: 000   0   可用状态

当一个流遇到数据类型不一致的错误而不可用时,我们可以使其恢复为有效状态(置换eof和fail位):

cin.clear( cin.rdstate() & ~cin.failbit & ~cin.badbit );   //cin.rdstate()表示流当前的状态

也可通过调用成员函数查看流的状态,如:

cin.eof()  cin.fail() cin.bad()  cin.good()  //相应状态为真则返回true,反则为false

cin从缓冲区读取数据,有多种方式,如操作符 >>  函数getline()、get()等

>>

// 演示操作符 >> 的用法
#include <iostream>
int main() {
    using namespace std;
    char str1[10];
    while(true) {
        cin >> str1;
        cout << str1 << endl;
    }
    return 0;
}

现在有个问题就是:cin中输入的字符数大于数组的长度会出现什么情况?

当遇到类型不一致时,流处于不可用状态,若需继续使用这个流,需恢复流的有效状态。

get

get用来获取字符还挺好用的,肯定不会出错。

// 演示get获取字符
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <signal.h>

void catch_signal(int signal) {
    using namespace std;
    switch(signal) {
    case SIGINT:
        cout << "ctrl + c被执行了......" << endl;
        exit(-1);
        break;
    }
}

int main() {
    using namespace std;
    // 注册中断信号
    signal(SIGINT, catch_signal);
    char c1;
    while(true) {
        cin.get(c1);
        cout << "c1 = " << c1 << endl;
    }
    return 0;
}

即get函数只会从缓冲区中取字符,而不会过滤掉任何空格换行符等。其实我这里有个疑惑,为啥cin.get(ch)可以只用变量名,而不用指针。

getline()

getline读取一行,以换行符结束,丢掉换行符。

还可指定读取多少个字符到数组,读取完后剩余的字符放在流中,流被置为无效状态,可以通过置换使他们变有效,然后继续读取,见例子。

#include <iostream>

int main() {
    using namespace std;
    char str[10];
    // 实际上只从流中读入9个字符, 最后一个字符为自动放一个0
    // getline遇到换行才结束
    cin.getline(str, 10);
    cout << str << endl;
    return 0;
}

cin >> n,之后使用getline会出现空行,调用cin.ignore()即可

如果注释掉cin.ignore(),输入2\enter,输出空行。

不注释,输入2\enterA,输出A。

因为cin有时会以\n作为结束标志,但它还在缓存区中,而getline以\n为结束标志,会读取上一次输入得到的\n,得到一个空行。

cin.ignore(1000, ‘\n‘)的含义是把缓冲区内从当前字符开始知道‘\n‘之前字符(如果有1000个的话)忽略掉,实际上你这里假设一行不会超过1000个字符,所以含义是忽略一行。

#include <iostream>

int main() {
    using namespace std;
    int n;
    // cin读入了之后会出现空行
    cin >> n;
    // 调用cin.ignore()可忽略空行
    cin.ignore();
    cout << "n = " << n << endl;

    char str[10];
    cin.getline(str, 10);
    cout << "str = " << str << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/tuhooo/p/9946112.html

时间: 2024-10-01 11:46:12

C++中cin的用法汇总的相关文章

(转)js中typeof的用法汇总

JavaScript中的typeof其实非常复杂,它可以用来做很多事情,但同时也有很多怪异的表现.本文列举出了它的多个用法,而且还指出了存在的问题以及解决办法. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FOperators%2Ftypeof > type

js中typeof的用法汇总[转载]

JavaScript中的typeof其实非常复杂,它可以用来做很多事情,但同时也有很多怪异的表现.本文列举出了它的多个用法,而且还指出了存在的问题以及解决办法. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FOperators%2Ftypeof > type

基于c语言中调试工具的用法汇总(不包含gdb)【转】

转自:http://www.jb51.net/article/36829.htm 是不是只有编译的时候才知道程序写了错误?有没有在未编译的时候就让机器帮你检查错误的工具呢? 答案是:有!! splint工具.用一个最简单的HELLO WORLD来表述: ===================================== 复制代码 代码如下: /*错误很明显*/ #include <stdio.h> int main(void) { print("hello world\n&q

C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法(转)

学C++的时候,这几个输入函数弄的有点迷糊:这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行) 1.cin 2.cin.get() 3.cin.getline() 4.getline() 5.gets() 6.getchar() 附:cin.ignore();cin.get()//跳过一个字符,例如不想要的回车,空格等字符 1.cin>>          用法1:最基本,也是最常用的用法,输入一个数字: #includ

C#中DllImport用法汇总

(转) 最近使用DllImport,从网上google后发现,大部分内容都是相同,又从MSDN中搜集下,现将内容汇总,与大家分享. 大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功能呢?答案是肯定的,大家可以通过C#中的DllImport直接调用这些功能. DllImport是System.Runtime.InteropServices命名空间下的

C++中cin.clear()的用法

我们谈谈cin.clear的作用,第一次看到这东西,很多人以为就是清空cin里面的数据流,而实际上却与此相差很远,首先我们看看以下代码: #include <iostream>  using namespace std;  int main()   {              int a;              cin>>a;              cout<<cin.rdstate()<<endl;              if(cin.rds

C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法

C++中cin.cin.get().cin.getline().getline().gets()等函数的用法 学C++的时候,这几个输入函数弄的有点迷糊:这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行) 1.cin 2.cin.get() 3.cin.getline() 4.getline() 5.gets() 6.getchar() 附:cin.ignore();cin.get()//跳过一个字符,例如不想要的回车,空

c++中cin的基本用法

一.最基本的用法cin>> 接收一个数字.字符.字符串,遇"空格"."TAB"."回车"都结束 例如: <span style="font-size:18px;"><span style="font-size:18px;">#include <iostream> using namespace std; main () { int a,b; cin>&g

C++中cin、cin.get()、cin.getline()、getline()、gets()等

学C++的时候,这几个输入函数弄的有点迷糊:这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行) 1.cin  2.cin.get()  3.cin.getline()  4.getline()  5.gets()  6.getchar() 附:cin.ignore();cin.get()//跳过一个字符,例如不想要的回车,空格等字符 1.cin>>          用法1:最基本,也是最常用的用法,输入一个数字: #i