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

原创 2012年03月28日 13:36:28
转自: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可以不写。
事实上我们很少在实际编程中非要用转义符加八进制数来表示一个字符,但是,大家碰到了以后要知道。


对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数

#include"stdio.h" #include"stdlib.h" #define OVERFLOW 0 #define OK 1 #define TRUE 1 #define FALSE 0 ...

HNCU 1330: 算法3-1:八进制数

题目描述 将十进制数转换为八进制,并输出。 图:将十进制数转换为八进制并输出 输入 输入包含若干十进制正整数。输出 输出相应的八进制数,每个占一行。样例输入 1 2 3 7 8...

题目1020: 八进制数

题目描述 将十进制数转换为八进制,并输出。 图:将十进制数转换为八进制并输出   输入 输入包含若干十进制正整数。   输出 ...
  • SJF0115
  • SJF0115
  • 2013年03月19日 11:14
  • 1798

给定n个十六进制正整数,输出它们对应的八进制数。

问题描述   给定n个十六进制正整数,输出它们对应的八进制数。
  • viclao
  • viclao
  • 2014年11月20日 23:54
  • 2508

挑战面试编程:十六进制数转化为八进制数

挑战面试编程:十六进制数转化为八进制数 题目: 问题描述   给定n个十六进制正整数,输出它们对应的八进制数。 输入格式   输入的第一行为一个正整数n (1...

利用栈的基本操作,将十进制数转换为八进制数

#include #include #include #define STACKSIZE 100 typedef int ElemType; typ...

汇编语言(二):从键盘输入十进制数,输出该十进制数的十进制,二进制(B),十六进制(H),八进制(Q)表示

;从键盘输入十进制数,输出该十进制数的十进制,二进制(B),十六进制(H),八进制(Q) ;用循环左移指令做的输出函数 DATA SEGMENT ;此处输入数据段代码 INFO1 DB 0...

十六进制数转八进制数

开始很糊涂的以为要先转变成十进制再转成八进制,结果因为数量级过大,发现此路不通。但是转2进制没有灵感,于是看了别人的代码。 #include #include using namespace s...

给定n个十六进制正整数,输出它们对应的八进制数。

问题描述   给定n个十六进制正整数,输出它们对应的八进制数。 输入格式   输入的第一行为一个正整数n (1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cin与getline 和 八进制数的表达方式
举报原因:
原因补充:

(最多只允许输入30个字)