关闭

cin与getline 和 八进制数的表达方式

648人阅读 评论(0) 收藏 举报
转自:http://hi.baidu.com/05104106/blog/item/7b7e8a77c68b5b13b151b9f2.html
cin.get()与cin.getline()区别在于前者对于终止符(terminator)“不抛弃,不放弃”,后者舍弃。string.h中的getline(istream,string)与cin.getline(string,streamsize)类似,但输入字符串后,回车在VC6下可能要按两次,Dev C++下不会。
cin.get()参数有四种,从0个到3个,其中Ch为模板类型参数:
int_type get();					//获得一个字符,可为eof与terminator
istream& get(Ch& p);				//获得一个字符给p,可为terminator,不可为eof
istream& get(Ch *p,streamsize n);	//定义最大输入,默认terminator为’\n’
istream& get(Ch *p,streamsize n,Ch term);	//重定义terminator,不再为’\n’
cin.getline()参数有两种,从2个到3个:
istream& getline(Ch *p,streamsize n);
istream& getline(Ch *p,streamsize n,Ch term);
举三个例子如下:
①	char ch;cin>>ch;
//A
char buf[256];cin.get(buf,256);
这时会出错,因为第一次cin>>ch;后,留下了’\n’在缓冲区;再get(buf,256)会立即遇到terminator而终止!须在A处补上cin.get();或cin.ignore();或者cin.clear();cin.sync();
②	而第二个程序(Bjarne书中的)将只打出第一行,因为cin.get()遇到’\n’立即录入,此时cin变为badbit:
while(cin){
cin.get(buf,256);cout<<buf;
}
③	第三个例子,可以获取buf,因为cin.getline()有抛弃终止符功能(discard the terminator),B行的cin.getline()将抛弃掉ch后面的’\n’,使第三行正常输入。
char ch;cin>>ch;
cin.getline(buf,256);	//B
cin.getline(buf,256);
cout<<buf<<endl;
总结:通常复制,用cin.getline()。按字节复制文件,用cin.get(ch)。
	用cin>>ch;或cin.get(buf,256);这种形式时就得考虑到残留的’\n’归属问题。
à再说几个小点的问题:
ostream os(cout)是不允许的,因为流对象不可拷贝构造,只能用ostream os(&cout);或者上文的ostream_iterator<T> os(cout);。
输入时,对iostream而言,整型015仍是15;而对iostream.h而言,015是八进制的13。两者不同。
定义char arr[]=”a\xdfk\0123\0”;对arr求sizeof(arr),结果为7。各个字符分别为’a’、’\xdf’、’k’、’\012’、’3’、’\0’、’\0’。八进制为3-digits,到超出7的数截止,以’\’开头;十六进制为arbitrary-digits,到超出f的数截止,以’\x’开头。想知道sizeof()的算法,怎么搞的?可以识别\0123与\0ab甚至\0\0,而不把它们当terminator?????
千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法。所以这里的\012就可以识别为八进制的数,不清楚sizeof的算法到底是什么,根据实验的结果好像是\后面如果是0到7的数字就可以最多连续识别三位为一个字符,如果不足三位时遇到7以上字符则识别结束。
而对它求strlen(),结果为3,以’\0’截止收尾。
1.八进制数的表达方法
C/C++语言中,如何表达一个八进制数呢?如果这个数是 876,我们可以断定它不是八进制数,因为八进制数中不可能出7以上的阿拉伯数字。但如果这个数是123、是567,或12345670,那么它是八进制数还是10进制数,都有可能。
所以, C/C++规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。这就是八进制数在C、C++中的表达方法。
由于C和C++都没有提供二进制数的表达方法,所以,这里所学的八进制是我们学习的,C,C++语言的数值表达的第二种进制法。
现在,对于同样一个数,比如是100,我们在代码中可以用平常的10进制表达,例如在变量初始化时:
int a = 100;
我们也可以这样写:
int a = 0144; //0144是八进制的100;一个10进制数如何转成8进制,我们后面会学到。
千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法。
2.八进制数在转义符中的使用
我们学过用一个转义符'/'加上一个特殊字母来表示某个字符的方法,如:'/n'表示换行(line),而'/t'表示Tab字符,'/''则表示单引号。今天我们又学习了一种使用转义符的方法:转义符'/'后面接一个八进制数,用于表示ASCII码等于该值的字符。
比如,查一下ASCII码表,我们找到问号字符(?)的ASCII值是63,那么我们可以把它转换为八进值:77,然后用 '/77'来表示'?'。由于是八进制,所以本应写成 '/077',但因为C/C++规定不允许使用斜杠加10进制数来表示字符,所以这里的0可以不写。
事实上我们很少在实际编程中非要用转义符加八进制数来表示一个字符,但是,大家碰到了以后要知道。


0
0

猜你在找
【套餐】Hadoop生态系统零基础入门
【套餐】嵌入式Linux C编程基础
【套餐】2017软考系统集成项目——任铄
【套餐】Android 5.x顶级视频课程——李宁
【套餐】深度学习入门视频课程——唐宇迪
【直播】广义线性模型及其应用——李科
【直播】从0到1 区块链的概念到实践
【直播】计算机视觉原理及实战——屈教授
【直播】机器学习之凸优化——马博士
【直播】机器学习&数据挖掘7周实训--韦玮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1196400次
    • 积分:12355
    • 等级:
    • 排名:第1131名
    • 原创:231篇
    • 转载:103篇
    • 译文:0篇
    • 评论:86条
    文章分类
    最新评论