C++ 中cin用法

合集下载

cin的介绍

cin的介绍

1.cin简介cin是C++编程语言中的标准输入流对象,即istream类的对象。

cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。

此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。

这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。

在理解cin功能时,不得不提标准输入缓冲区。

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

cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。

2. cin的常用读取方法使用cin从标准输入读取数据时,通常用到的方法有cin>>,cin.get,cin.getline。

2.1cin>>的用法cin可以连续从键盘读取想要的数据,以空格、tab或换行作为分隔符。

实例程序如下。

#include <iostream>usingnamespace std;int main(){char a;int b;float c;stringcin>>a>>b>>c;cout<<a<<" "<<b<<" "<<c<<" "<<endl;system("pause");return0;}在屏幕中一次输入:a[回车]11[回车]5.56[回车],程序将输出如下结果:注意:(1)cin>>等价于cin.operator>>(),即调用成员函数operator>>()进行读取数据。

cin与cout的用法

cin与cout的用法

cin与cout一:标准输入函数cin不知道说它是个函数对还是不对,它是代表标准的输入设备--键盘。

他是属于流的,他的用法和流的用法是一样的。

也就是:cin>>变量;小小的说明一下,输入多个变量可以写在一行,如:cin>>x>>y>>z;这样写不是不允许,而是不好看,如果是不同的变量类型,那就更是没头没脑了。

除了你,人家是不知道该输入什么的,所以,一般在输入语句的前面,我们一般都要做一个提示,请输入×××,让人家心里有个底,知道这个变量是做什么的。

另外,这个函数是不用带地址符号"&"的,也不用写明变量类型,千万不要跟scanf混淆。

当然他就也不检查变量输入是否合法。

如:int i;cout<<"please input a number:"cin>>i;cout<<"i="<<i<<endl;如果你输入的是一个字符如'a'那么他也不检查,但你输出的结果不是正确的,这要是手工进行检查。

当然他也跟scanf一样,如果在循环内部输入不合法的变量值,那么也将陷入死循环。

如下:/*一个输入不合法变量陷入死循环的例子*/#include<iostream.h>main(){int i;while(i!=-1){cout<<"i="cin>>i;/*请输入不是一个字符如'a'试试*/cout<<endl;}}如上一个程序,如果你输入的不合法,那就将陷入死循环。

解决的办法有个一,把cin>>i;语句移到判断循环的语句中,那么,你输入的如果是不合法的变量,他将跳出循环。

cin是用空格来分隔输入的。

请看看如下的例子:/*一个空格分隔使输入的变量达不到希望的值*/#include<iostream.h>main(){char str[20];cout<<"please input a string:";cin>>str;/*你试着输入"hello word"*/ cout<<endl<<"str="<<str;}看得到是什么结果呢?得到的仅仅是str=hello,为什么呢?因为cin是以空格为分隔的,当你输入一个空格时,那他就认为后面的输入不属于这里了,认为应该给后面的变量了。

cin.get()和cin.getline()之间的区别

cin.get()和cin.getline()之间的区别
cin.get()每次读取一整行并把由Enter键生成的换行符留在输入队列中,比如:
复制代码 代码如下:
#include <iostream> using std::cin; using std::cout; const int SIZE = 15; int main( ){ cout << "Enter your name:"; char name[SIZE]; cin.get(name,SIZE); cout << "name:" << name; cout << "\nEnter your address:"; char address[SIZE]; cin.get(address,SIZE); cout << "address:" << address; }
输出: Enter your name:jimmyi shi name:jimmyi shi Enter your address:YN QJ address:YN QJ
由于由Enter生成的换行符被抛弃了,所以不会影响下一次cin.get()对地址的读取。 如果cin.get()是一个一个字符的读入,但是cin.get()不会忽略任何字符,对于回车符需要单独处理。
(1) 学会区别get()与getline(); (次读取一整行并把由Enter键生成的换行符抛弃,如:
复制代码 代码如下:
#include <iostream> using std::cin; using std::cout; const int SIZE = 15; int main( ){ cout << "Enter your name:"; char name[SIZE]; cin.getline(name,SIZE); cout << "name:" << name; cout << "/nEnter your address:"; char address[SIZE]; cin.get(address,SIZE); cout << "address:" << address; }

cinignore的用法

cinignore的用法

cignore是C语言中的预编译指令,用于忽略某些代码行,但是这个指令并非标准C 语言的一部分,所以在不同的编译器和平台上可能会有不同的实现。

一般情况下,在源代码中定义了cignore指令,编译器在编译该源代码时会忽略这些指令。

这有助于编程人员在调试程序时,快速地临时禁用代码行,而无需注释掉代码。

这也能够减少对代码的修改以及需要恢复原代码的工作量。

cignore指令可以通过在代码行前面添加#cignore或#cignore! 来使用。

例如:
printf("不想执行的代码行!\n");
#cignore
printf("这行代码不会执行!\n");
上述代码# cignore 指令忽略了第二行的代码,不会被执行。

在需要恢复该代码时,只需要将cignore 去掉即可。

需要注意,cignore指令只是编译器在编译时忽略目标代码行。

在编译时,预编译器会先处理代码中的#cignore 指令,然后将其中的内容忽略,最终生成可执行文件的代码中不包含被#cignore 指令标记为忽略的代码行。

C++cin输入的多种方法详解

C++cin输入的多种方法详解

C++cin输⼊的多种⽅法详解⽬录前⾔⼀、cin1、cin >>2、cin.get()2.1 函数介绍3、getline()前⾔在C++中⼀般使⽤cin来进⾏交互,获取⽤户输⼊信息。

cin是C++编程语⾔中的标准输⼊流对象,即stream类的对象。

cin主要⽤于从标准输⼊读取数据,这⾥的标准输⼊,指的是终端的键盘。

主要⽤到有cin >>、cin.get()、cin.getline()。

cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,⼀旦缓冲区中有数据,就触发cin的成员函数去读取数据。

⼀、cin1、cin >>⽀持连续读取,以Tab、空格为分隔符,换⾏符为结束符号;/*----------------------------------------------------------------------> File Name: cinDemo01.cpp> Author: Jxiepc> Mail: Jxiepc> Created Time: Mon 20 Sep 2021 10:09:55 AM CST----------------------------------------------------------------------*/#include<iostream>#include<unistd.h>#include<cstring>int main(int argc, char *argv[]){std::string s;while(std::cin >> s){std::cout << s << std::endl;}return 0;}当cin>>从缓存区读取数据时,会⾃动忽略作为第⼀个字符存在的Tab、空格(Space)、换⾏,继续读取下⼀个字符,若缓存区为空,则等待。

转载C++输入与输出—cout和cin的用法

转载C++输入与输出—cout和cin的用法

转载C++输⼊与输出—cout和cin的⽤法转载⽹址:输⼊和输出并不是C++语⾔中的正式组成成分。C和C++本⾝都没有为输⼊和输出提供专门的语句结构。输⼊输出不是由C++本⾝定义的,⽽是在编译系统提供的I/O库中定义的。C++的输出和输⼊是⽤“流”(stream)的⽅式实现的。图3.2和图3.3表⽰C++通过流进⾏输⼊输出的过程。有关流对象cin、cout和流运算符的定义等信息是存放在C++的输⼊输出流库中的,因此如果在程序中使⽤cin、cout和流运算符,就必须使⽤预处理命令把头⽂件stream包含到本⽂件中:#include <iostream>尽管cin和cout不是C++本⾝提供的语句,但是在不致混淆的情况下,为了叙述⽅便,常常把由cin和流提取运算符“>>”实现输⼊的语句称为输⼊语句或cin语句,把由cout和流插⼊运算符“<<”实现输出的语句称为输出语句或cout语句。根据C++的语法,凡是能实现某种操作⽽且最后以分号结束的都是语句。⼀、输⼊流与输出流的基本操作cout语句的⼀般格式为:cout<<表达式1<<表达式2<<……<<表达式n;cin语句的⼀般格式为:cin>>变量1>>变量2>>……>>变量n;在定义流对象时,系统会在内存中开辟⼀段缓冲区,⽤来暂存输⼊输出流的数据。在执⾏cout语句时,先把插⼊的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或'\n',ends,flush)为⽌,此时将缓冲区中已有的数据⼀起输出,并清空缓冲区。输出流中的数据在系统默认的设备(⼀般为显⽰器)输出。⼀个cout语句可以分写成若⼲⾏。如cout<<"This is a simple C++ program."<<endl;可以写成cout<<"This is " //注意⾏末尾⽆分号<<"a C++ "<<"program."<<endl; //语句最后有分号也可写成多个cout语句,即cout<<"This is "; //语句末尾有分号cout <<"a C++ ";cout <<"program.";cout<<endl;以上3种情况的输出均为This is a simple C++ program.注意不能⽤⼀个插⼊运算符“<<”插⼊多个输出项,如:cout<<a,b,c; //错误,不能⼀次插⼊多项cout<<a+b+c; //正确,这是⼀个表达式,作为⼀项在⽤cout输出时,⽤户不必通知计算机按何种类型输出,系统会⾃动判别输出数据的类型,使输出的数据按相应的类型输出。如已定义a为int型,b 为float型,c为char型,则cout<<a<<' '<<b<<' '<<c<<endl;会以下⾯的形式输出:4 345.789 a与cout类似,⼀个cin语句可以分写成若⼲⾏。如cin>>a>>b>>c>>d;可以写成cin>>a //注意⾏末尾⽆分号>>b //这样写可能看起来清晰些>>c>>d;也可以写成cin>>a;cin>>b;cin>>c;cin>>d;以上3种情况均可以从键盘输⼊: 1 2 3 4 ↙也可以分多⾏输⼊数据:1↙2 3↙4↙在⽤cin输⼊时,系统也会根据变量的类型从输⼊流中提取相应长度的字节。如有char c1,c2;int a;float b;cin>>c1>>c2>>a>>b;如果输⼊1234 56.78↙注意: 34后⾯应该有空格以便和56.78分隔开。也可以按下⾯格式输⼊:1 2 34 56.78↙ (在1和2之间有空格)不能⽤cin语句把空格字符和回车换⾏符作为字符输⼊给字符变量,它们将被跳过。如果想将空格字符或回车换⾏符(或任何其他键盘上的字符)输⼊给字符变量,可以⽤3.4.3节介绍的getchar函数。在组织输⼊流数据时,要仔细分析cin语句中变量的类型,按照相应的格式输⼊,否则容易出错。⼆、在输⼊流与输出流中使⽤控制符上⾯介绍的是使⽤cout和cin时的默认格式。但有时⼈们在输⼊输出时有⼀些特殊的要求,如在输出实数时规定字段宽度,只保留两位⼩数,数据向左或向右对齐等。C++提供了在输⼊输出流中使⽤的控制符(有的书中称为操纵符)。需要注意的是: 如果使⽤了控制符,在程序单位的开头除了要加iostream头⽂件外,还要加iomanip头⽂件。举例: 输出双精度数。double a=123.456789012345;对a赋初值(1) cout<<a;输出: 123.456(2) cout<<setprecision(9)<<a;输出: 123.456789(3) cout<<setprecision(6);恢复默认格式(精度为6)(4) cout<< setiosflags(ios∷fixed);输出: 123.456789(5) cout<<setiosflags(ios∷fixed)<<setprecision(8)<<a;输出: 123.45678901(6) cout<<setiosflags(ios∷scientific)<<a;输出: 1.234568e+02(7) cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a; 输出: 1.2346e02下⾯是整数输出的例⼦:int b=123456;对b赋初值(1) cout<<b;输出: 123456(2) cout<<hex<<b; 输出: 1e240(3) cout<<setiosflags(ios∷uppercase)<<b;输出: 1E240(4) cout<<setw(10)<<b<<','<<b; 输出: 123456,123456(5) cout<<setfill('*')<<setw(10)<<b;输出: **** 123456(6) cout<<setiosflags(ios∷showpos)<<b;输出: +123456如果在多个cout语句中使⽤相同的setw(n),并使⽤setiosflags(ios∷right),可以实现各⾏数据右对齐,如果指定相同的精度,可以实现上下⼩数点对齐。例3.1 各⾏⼩数点对齐。#include <iostream>#include <iomanip>using namespace std;int main( ){double a=123.456,b=3.14159,c=-3214.67;cout<<setiosflags(ios∷fixed)<<setiosflags(ios∷right)<<setprecision(2);cout<<setw(10)<<a<<endl;cout<<setw(10)<<b<<endl;cout<<setw(10)<<c<<endl;return0;}输出如下:123.46 (字段宽度为10,右对齐,取两位⼩数)3.14-3214.67先统⼀设置定点形式输出、取两位⼩数、右对齐。这些设置对其后的输出均有效(除⾮重新设置),⽽setw只对其后⼀个输出项有效,因此必须在输出a,b,c之前都要写setw(10)。学C++的时候,这⼏个输⼊函数弄的有点迷糊;这⾥做个⼩结,为了⾃⼰复习,也希望对后来者能有所帮助,如果有差错的地⽅还请各位多多指教(本⽂所有程序均通过VC 6.0运⾏)转载请保留作者信息;1、cin1、cin.get()2、cin.getline()3、getline()4、gets()5、getchar()1、cin>>⽤法1:最基本,也是最常⽤的⽤法,输⼊⼀个数字:#include <iostream>using namespace std;main (){int a,b;cin>>a>>b;cout<<a+b<<endl;}输⼊:2[回车]3[回车]输出:5⽤法2:接受⼀个字符串,遇“空格”、“TAB”、“回车”都结束#include <iostream>using namespace std;main (){char a[20];cin>>a;cout<<a<<endl;}输⼊:jkljkljkl输出:jkljkljkl输⼊:jkljkl jkljkl //遇空格结束输出:jkljkl2、cin.get()⽤法1: cin.get(字符变量名)可以⽤来接收字符#include <iostream>using namespace std;main (){char ch;ch=cin.get(); //或者cin.get(ch);cout<<ch<<endl;}输⼊:jljkljkl输出:j⽤法2:cin.get(字符数组名,接收字符数⽬)⽤来接收⼀⾏字符串,可以接收空格#include <iostream>using namespace std;main (){char a[20];cin.get(a,20);cout<<a<<endl;}输⼊:jkl jkl jkl输出:jkl jkl jkl输⼊:abcdeabcdeabcdeabcdeabcde (输⼊25个字符)输出:abcdeabcdeabcdeabcd (接收19个字符+1个'\0')⽤法3:cin.get(⽆参数)没有参数主要是⽤于舍弃输⼊流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数⽬)的不⾜.这个我还不知道怎么⽤,知道的前辈请赐教;3、cin.getline() // 接受⼀个字符串,可以接收空格并输出#include <iostream>using namespace std;main (){char m[20];cin.getline(m,5);cout<<m<<endl;}输⼊:jkljkljkl输出:jklj接受5个字符到m中,其中最后⼀个为'\0',所以只看到4个字符输出;如果把5改成20:输⼊:jkljkljkl输出:jkljkljkl输⼊:jklf fjlsjf fjsdklf输出:jklf fjlsjf fjsdklf//延伸://cin.getline()实际上有三个参数,cin.getline(接受字符串的看哦那间m,接受个数5,结束字符)//当第三个参数省略时,系统默认为'\0'//如果将例⼦中cin.getline()改为cin.getline(m,5,'a');当输⼊jlkjkljkl时输出jklj,输⼊jkaljkljkl时,输出jk当⽤在多维数组中的时候,也可以⽤cin.getline(m[i],20)之类的⽤法:#include<iostream>#include<string>using namespace std;main (){char m[3][20];for(int i=0;i<3;i++){cout<<"\n请输⼊第"<<i+1<<"个字符串:"<<endl;cin.getline(m[i],20);}cout<<endl;for(int j=0;j<3;j++)cout<<"输出m["<<j<<"]的值:"<<m[j]<<endl;}请输⼊第1个字符串:kskr1请输⼊第2个字符串:kskr2请输⼊第3个字符串:kskr3输出m[0]的值:kskr1输出m[1]的值:kskr2输出m[2]的值:kskr34、getline() // 接受⼀个字符串,可以接收空格并输出,需包含“#include<string>”#include<iostream>#include<string>using namespace std;main (){string str;getline(cin,str);cout<<str<<endl;}输⼊:jkljkljkl输出:jkljkljkl输⼊:jkl jfksldfj jklsjfl输出:jkl jfksldfj jklsjfl和cin.getline()类似,但是cin.getline()属于istream流,⽽getline()属于string流,是不⼀样的两个函数5、gets() // 接受⼀个字符串,可以接收空格并输出,需包含“#include<string>”#include<iostream>#include<string>using namespace std;main (){char m[20];gets(m); //不能写成m=gets();cout<<m<<endl;}输⼊:jkljkljkl输出:jkljkljkl输⼊:jkl jkl jkl输出:jkl jkl jkl类似cin.getline()⾥⾯的⼀个例⼦,gets()同样可以⽤在多维数组⾥⾯:#include<iostream>#include<string>using namespace std;main (){char m[3][20];for(int i=0;i<3;i++){cout<<"\n请输⼊第"<<i+1<<"个字符串:"<<endl;gets(m[i]);}cout<<endl;for(int j=0;j<3;j++)cout<<"输出m["<<j<<"]的值:"<<m[j]<<endl;}请输⼊第1个字符串:kskr1请输⼊第2个字符串:kskr2请输⼊第3个字符串:kskr3输出m[0]的值:kskr1输出m[1]的值:kskr2输出m[2]的值:kskr3⾃我感觉gets()和cin.getline()的⽤法很类似,只不过cin.getline()多⼀个参数罢了;这⾥顺带说明⼀下,对于本⽂中的这个kskr1,kskr2,kskr3的例⼦,对于cin>>也可以适⽤,原因是这⾥输⼊的没有空格,如果输⼊了空格,⽐如“ks kr jkl[回车]”那么cin就会已经接收到3个字符串,“ks,kr,jkl”;再如“kskr 1[回车]kskr 2[回车]”,那么则接收“kskr,1,kskr”;这不是我们所要的结果!⽽cin.getline()和gets()因为可以接收空格,所以不会产⽣这个错误;6、getchar() //接受⼀个字符,需包含“#include<string>”#include<iostream>#include<string>using namespace std;main (){char ch;ch=getchar(); //不能写成getchar(ch);cout<<ch<<endl;}输⼊:jkljkljkl输出:j。

cin,cout用法详解

cin,cout用法详解

在C中,输入输出要用printf和scanf,这是2个很麻烦的东西,因为在输入数据的同时还要说明数据的类型,如果输入数据较多,那就很麻烦了,所以我们的C++搞了两个更爽的东西cout和cin,来替换它们.首先我们先了解一下这两个东西的来处,它们是来自C++的一个类库叫 " iostream".iostream是由istream(输入类)和ostream(输出类)派生.所以在iostream中就有了输入和输出的相关对象:1,cin,表示标准输入(standard input)的istream类对象.cin使我们可以从设备读取数据.2,cout,表示标准输出(standard output)的ostream类对象.cout使我们可以向设备输出或者写数据.3,cerr(暂时还没试过,先别理吧)暂时先介绍那么多,这里我主要想说的是cin.get()和cin.getline(),cin.clear(),cin.sync()等的用法.首先看看cin.get(),它是一个读取单个字符的方法.字符变量=cin.get();相当于cin.get(字符变量);#include<iostream>usingnamespace std;int main(){char cstr;cstr=cin.get(); //读取单个字符,在屏幕输入,也相当于cin.get(cstr);cout<<cstr<<endl; //输出刚刚载入的单个字符system("pause");}运行程序后,一切正常:输入:a 输出:a但当我们输入的不只一个英文字符时,那又会如何呢?输入:abcd 输出:a由此可知,它只能读取第一个字符,但如果我们把程序修改成:int main(){char cstr;char bstr;cstr=cin.get(); //读取单个字符,在屏幕输入bstr=cin.get();cout<<cstr<<bstr<<endl; //输出刚刚载入的单个字符system("pause");}我们再输入:abcd 最后输出了:ab既然cin.get()是读取第一个字符,那bstr为什么不也是a呢?其实原理是这样的:在cin这个对象里,有一个储存字符的流,可以想象成缓冲区,但事实上是cin里封装的一个东西.当我们在程序上输入字符后,对象cin获得了我们输入的字符,例如获得abcd,然后再通过.get()把流里面的第一个字符去掉,赋给cstr,这时,cin里储存的流的数据为bcd,而cstr则获得了 a.当我们再次运行bstr=cin.get();时,同理把cin里流的数据的b拿出来给了bstr,此后,cin里面的流的数据为cd,而bstr则为b,所以最后输出时,便能输出ab了.还有个补充,究竟什么时候才输入数据呢?我们可以再通过上面的代码进行尝试,我们输入单个字母'a',然后按回车,发现并没有输出数据,而是再等待一次输入数据,我们再输入字母'b',按回车后便输出ab了.相信到这里,大家都应该明白了,因为当我们第一次输入a后,通过cstr=cin.get();使cin里的流没有数据,清空了.所以到第二次要再赋给bstr值时,它找不到数据,要重新再输入数据.由此来看可以知道,当cin里的流数据清空时,便需要重新输入才能赋值.而cin.get()还有个用法:int main(){char cstr;char bstr;cstr=cin.get(); //读取单个字符,在屏幕输入cin.get();bstr=cin.get();cout<<cstr<<bstr<<endl; //输出刚刚载入的单个字符system("pause");}程序中有3个cin.get(),所以我们尝试输入:abc. 发现输出了:ac由此能知道,当空回调cin.get();时,cin.get便自动在cin中的流数据中删除一个字母,起了一个删除作用.对cin.get()有了一定了解之后,对cin.getline()的学习就可以更快了,原理是一致的,但是cin.getline()则是获取一整行文本.以下是cin.getline()原形: getline(char *line,intsize,char='\n')第一个就是字符指针,第二个是字符长度,第三个1行的结束标识符.int main(){char cstr[200];cin.getline(cstr,sizeof(str));//第三个参数不输入,默认回车为结束标识符cout<<cstr<<endl; //输出system("pause");}这样我们输入一堆英文或数字,然后按回车,就会输出一行刚刚输出的东西了.接下来.我们讨论第三个参数的作用.int main(){char cstr[200];cin.getline(cstr,sizeof(str),'X'); //我们以单个英文字母'X'作为终止标识符cout<<cstr<<endl; //输出system("pause");}当我们输入一大堆东西,例如输入: kkkkkkk(回车) 输出: kkkkkkk(回车)llllllx(回车) llllll这样X便成了终止符,其原理和cin.get一样.或许我们可以像cin.get那样尝试一下:int main(){char cstr[200];char bstr[200];cin.getline(cstr,sizeof(str),'X'); //我们以单个英文字母'X'作为终止标识符cin.getline(bstr,sizeof(btr),'a');cout<<"第一行是:"<<cstr<<endl; //输出cout<<"第二行是:"<<bstr<<endl;system("pause");}我们输入:kkkkkkkkk(回车) 输出:第一行是:kkkkkkkkk(回车)oooooooooX(回车) oooo ooooo(回车)bbbbbbbbba(回车) 第二行是:(回车)bbbbbbbbb在这里,我在不厌其烦地说一下原理,如果刚刚cin.get()原理看懂的可以跳过. 首先,我们第一次getline会把X前面的字符赋给cstr,然后从cin里的数据流删除,标识符X也删除了,所以输出的cstr如上所示.当我们第二次运行getline 时,此时cin里的数据流为(回车)bbbbbbbbba,回车也是一个字符,事实上在数据流里用"\n"表示,接着就按照原来第一次的方法,把标识符'a'前面的字符赋给bstr,然后再删除字符号及标识符.所以输出结果如上.接下来我们谈谈cin.clear的作用,第一次看到这东西,很多人以为就是清空cin 里面的数据流,而实际上却与此相差很远,首先我们看看以下代码:#include<iostream>usingnamespace std;int main(){int a;cin>>a;cout<<cin.rdstate()<<endl;if(cin.rdstate() == ios::goodbit){cout<<"输入数据的类型正确,无错误!"<<endl;}if(cin.rdstate() == ios_base::failbit){cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl; }system("pause");}我们定义要输入到的变量是整型,但如果我们输入了英文字母或者汉字,那就会发生错误,cin里有个方法能检测这个错误,就是cin.rdstate();当cin.rdstate()返回0(即ios::goodbit)时表示无错误,可以继续输入或者操作,若返回4则发生非致命错误即ios::failbit,则不能继续输入或操作.而cin.clear则可以控制我们此时cin里对这个问题的一个标识.语发如下:cin.clear(标识符);标识符号为:∙goodbit 无错误∙Eofbit 已到达文件尾∙failbit 非致命的输入/输出错误,可挽回∙badbit 致命的输入/输出错误,无法挽回若在输入输出类里.需要加ios::标识符号通过cin.clear,我们能确认它的内部标识符,如果输入错误则能重新输入.结合真正的清空数据流方法cin.sync(),请看下例:#include<iostream>usingnamespace std;int main(){int a;while(1){cin>>a;if(!cin) //条件可改写为cin.fail(){cout<<"输入有错!请重新输入"<<endl;cin.clear();cin.sync(); //清空流}else{cout<<a;break;}}system("pause");}上面的cin默认参数为0,即无错误,正常操作.当我们输入英文字母'k'时,它的状态标识改为fail(即1),即错误,用cout对用户输出信息,再用cin.clear 让错误标识改回为0,让我们可以继续输入,再清空流数据继续输入.如果我们没有了cin.clear,则会进入死循环,其过程为我们输入了英文字母,它的状态标识便为fail,当运行到条件判断时,便总是回到错误的条件表示里,并且我们再也没办法输入,因为错误的表示关闭了cin,所以会进入死循环.对比:输入字符串1.cin>>的读入方式总是将前导的空格(包括空格,回车,水平或垂直制表符等)过滤2.getline可将字符串一次性地输入。

CIN

CIN

CIN(Code Interface Node)节点是LabVIEW中用来调用C/C++代码的功能节点。

它与动态链接库的不同之处在于,它能够将代码集成在VI中作为单独的一个VI发布,而不需要多余的文件。

另外,它提供了函数入口,它可以根据用户提供的输入输出自动生成函数入口代码,从而使用户专心关注代码功能而不用为函数声明、定义等语句费心。

因此CIN节点与DLL在不同的场合有不同的优势,但是CIN节点的使用比调用DLL要复杂得多。

由于LabVIEW中数据的存储格式遵循了C语言中数据的存储格式,并且二者完全相同,所以用户可以向CIN传递任意复合的数据结构。

另外,CIN比图形化语言可获得更高的执行效率。

注意:对于完全相同的代码,CIN和DLL的执行效率是完全一样的。

如果要使用CIN节点,你必须安装了C编译器。

在Windows下,CIN支持以下编译器:Microsoft Visual C++Symantec CCIN节点必须调用.lsb文件。

.lsb文件是通过外部编译器与CINTools工具结合将C代码编译生成的。

下面我们通过一个Step by Step的实例来看如何在LabVIEW中实现CIN节点调用,本例所用外部编译器为Microsoft Visual C++ 6.0。

例18.6 利用CIN节点实现加法运算第一步:在程序框图放置一个空CIN节点;右键选择Connectivity->Libraries & Executables->Code Interface Node(互连接口-->库和可执行程序-->代码接口节点)第二步:创建CIN节点的输入输出端口;初始情况下,CIN只有一对端口:一个输入端口和一个输出端口。

向下拉大节点边框或右击节点端口选择Add Parameter,可以为节点增加输入输出端口。

CIN节点的端口都是成对出现的,因为CIN节点端口传递的是指针,所以该参数既可以作为输入又可以作为输出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

输入原理:
程序的输入都建有一个缓冲区,即输入缓冲区。

一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。

正因为cin 函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入
#1:
#include <iostream>
using namespace std;
int main()
{
char str[8];
cin.getline(str, 5);
cout<<str<<endl;
cin.getline(str, 5);
cout<<str<<endl;
return0;
}
测试:
abcdefgh (回车)
abcd (输出)
(输出-换行)
【分析】之所以第一次输入完后直接程序就结束了,而不是进行第二次输入,是因为第一次多输入的数据还残留在缓存区中,第二次输入就直接从缓存区中提取而不会请求键盘输入,以下探讨几种常见的输入方式:
一. cin>>
该操作符是根据后面变量的类型读取数据。

输入结束条件:遇到Enter、Space、Tab键。

对结束符的处理:丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)
#2:
#include <iostream>
using namespace std;
int main()
{
char str1[10], str2[10];
cin>>str1;
cin>>str2;
cout<<str1<<endl;
cout<<str2<<endl;
return0;
}
测试:
abcd efgh
输出:
abcd
efgh
【分析】第一次读取字符串时遇到空格则停止了,将abcd读入str1,并舍弃了空格,将后面的字符串给了第二个字符串。

这证明了cin读入数据遇到空格结束;并且丢弃空格符;缓冲区有残留数据,读入操作直接从缓冲区中取数据。

二.cin.get(数组名,长度,结束符)
其中结束符为可选参数,读入的字符个数最多为(长度-1)个,结束符规定结束字符串读取的字符,默认为ENTER
若要读取字符,直接cin.get(char ch)或ch=cin.get()即可
读取字符的情况:
输入结束条件:Enter键
对结束符处理:不丢弃缓冲区中的Enter
cin.get() 与cin.get(char ch)用于读取字符,他们的使用是相似的,
即:ch=cin.get() 与cin.get(ch)是等价的。

#3:
#include <iostream>
using namespace std;
int main()
{
char c1, c2;
cin.get(c1);
cin.get(c2);
cout<<c1<<""<<c2<<endl; // 打印两个字符
cout<<(int)c1<<""<<(int)c2<<endl; // 打印这两个字符的ASCII值
return0;
}
测试一输入:
a[Enter]
输出:
a
97 10
【分析】会发现只执行了一次从键盘输入,显然第一个字符变量取的’a', 第二个变量取的是Enter(ASCII值为10),这是因为该函数不丢弃上次输入结束时的Enter字符,所以第一次输入结束时缓冲区中残留的是上次输入结束时的Enter字符!
测试二输入:
a b[Enter]
输出:
a
97 32
【分析】显然第一个字符变量取的’a', 第二个变量取的是Space(ASCII值为32)。

原因同上,没有丢弃Space字符。

读取字符串的情况:
输入结束条件:默认Enter键(因此可接受空格,Tab键),可在第三个参数上自定义结束符
对结束符处理:丢弃缓冲区中的Enter
#4:
#include <iostream>
using namespace std;
int main ()
{
char ch, a[20];
cin.get(a, 5 , 'd');
cin>>ch;
cout<<a<<endl;
cout<<(int)ch<<endl;
return0;
}
测试一输入:
12345[Enter]
输出:
1234
53
【分析】第一次输入超长,字符串按长度取了"1234",而’5′仍残留在缓冲区中,所以第二次输入字符没有从键盘读入,而是直接取了’5′,所以打印的ASCII值是53(’5′的ASCII 值)。

测试二输入:
12d45[Enter]
输出:
12
d
【分析】第二次输出为d,说明自定义结束符时不丢弃缓冲区中的结束符
三.cin.getline()
cin.getline(数组名,长度,结束符) 大体与cin.get(数组名,长度,结束符)类似。

区别在于:
cin.get()当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。

但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。

#5:
#include <iostream>
using namespace std;
int main ()
{
char ch, a[20];
cin.getline(a, 5);
cin>>ch;
cout<<a<<endl;
cout<<(int)ch<<endl;
return0;
}
测试输入:
12345[Enter]
输出:
1234
-52
【分析】与cin.get()的例子比较会发现,这里的ch并没有读取缓冲区中的5,而是返回了-52,这里其实cin>>ch语句没有执行,是因为cin出错了!cin的错误处理下次介绍。

相关文档
最新文档