对C++ STL iostram 中 cin.get(char* cs,int size,char c='/n') 的理解

其中 cs 是指向 char 的 buf, size是buf的长度,

c是终止字符(default=='/n')。

 

void main()
{

 const int size = 16;

 char cs[size];

 while(cin.get(cs,size))
 {
  int i=cin.gcount();
  cout<<i<<": "<<cs<<endl;

  cin.ignore();
 }

我猜测 cin.get()是这样的运行步骤:

0     cin.get()试图从OS管理的输入缓冲(在用户敲键盘时触发对应

      中断,然后由中断处理例程将按键键码转换为ascii码值,放

      到OS内部缓冲里。)中取字符,如果缓冲为空则等待

用户输入,否则跳到步骤2;

1     用户按回车键后,cin.get()继续取得控制权;

2     cin.get()对输入缓冲中字符做如下处理:

a 当输入缓冲中第一个字符为终止字符或到达文件末尾时

cin.get()退出并返回false;

b 否则,cin.get()依次将输入缓冲的字符move(注意不是copy)

到cs中,直到遇到一下3种情况之一 :到达文件末尾、已

move的字符数等于size-1、输入缓冲的字符是终止字符。

这时,cin.get()将’/0’字符插入cs末尾。如果这时输入缓冲

还有字符,则这些字符被保留。(上面的第3种情况里终止

字符也被保留在输入缓冲中而不被取出。);

       c cin.get()退出并返回true.

3 这时执行while block 中的代码,其中使用cin.ignore()将输入

       缓冲里第一个字符---即终止字符删除。(原因如下。)

4 while 再次调用 get.line() 从而回到步骤 0 。这时如果没有

    上面的cin.ignore(),由于输入缓冲里第一个字符就是终止字符,

所以就会退出while。

 

时间: 2024-11-01 19:22:22

对C++ STL iostram 中 cin.get(char* cs,int size,char c=&#39;/n&#39;) 的理解的相关文章

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++中cin,cin.getline()中换行符问题

问题描述 c++中cin,cin.getline()中换行符问题 代码1. int a; cin>>a; char b[10]; cin>>b; 代码2. int a; cin>>a; char b[10]; cin.getline(b,10); 我看书上说cin 见到换行符结束然后换行符留在了输入序列中,那为什么为什么代码1不会出现问题,而代码2会出现问题? 解决方案 原因很简单,因为cin自动把enter忽略了,而cin.getline不行,因为默认是遇到'n'就结

数据库-在2000中 int 与 char 和 money 都能进行默认转换吗

问题描述 在2000中 int 与 char 和 money 都能进行默认转换吗 在20000数据库中可以直接将money类型转换为char类型吗 解决方案 用convert函数转为nvarchar之类的 解决方案二: 在2005中是不是就不用convert 就能直接转换

怎样删除STL容器中的元素

怎样删除STL容器中的元素 去除一个容器中有特定值的所有对象: 如果容器是vector.string或deque,使用erase-remove惯用法. 如果容器是list,使用list::remove. 如果容器是标准关联容器,使用它的erase成员函数. 去除一个容器中满足一个特定判定式的所有对象: 如果容器是vector.string或deque,使用erase-remove_if惯用法. 如果容器是list,使用list::remove_if. 如果容器是标准关联容器,使用remove_c

VC之CString,wchar_t,int,string,char*之间的转换

    VC之CString,wchar_t,int,string,char*之间的转换 1. CString 转 wchar_t CString path = "asdf"; wchar_t wstr[256] = path.AllocSysString(); 或者: wchar_t wcstring[256]; MultiByteToWideChar(CP_ACP,0,path,-1,wcstring,256);   2. wchar_t转CString WideCharToMul

int main(int argc,char* argv[])详解

argc是命令行总的参数个数      argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数     命令行后面跟的用户输入的参数,比如:     int   main(int   argc,   char*   argv[])     {     int   i;     for   (i   =   0;   i<argc;   i++)     cout<<argv[i]<<endl;     cin>>i;     return   0; 

c++-C++中指针声明时,int* p=0跟int *p=0哪个比较好?为什么?

问题描述 C++中指针声明时,int* p=0跟int *p=0哪个比较好?为什么? 新手学习C++时候,发现有些书写 int* p=0; 有些书写: int *p=0; 这两个有区别吗?区别在哪里?为什么会有两种写法? 还有下面的两种有区别吗?区别在哪里? int* const p=0; int const *p=0; 解决方案 第一个问题,这是定义一个int* p指针变量,(int p)<--->(int p) 这两种是等价,编译器会处理中间的空白符问题.第二个问题,int *const

关于char * ch指针和char ch [10]数组的区别

问题描述 关于char * ch指针和char ch [10]数组的区别 char ch1[10];char * ch2;如果现在要将一个c风格字符串赋给这两个对象,void copy1(char ch1[10]char * temp)void copy2(char * ch2char * temp)为什么后者可以直接ch2=temp而前者只能用strcpy? 解决方案 ch2是指针,所以=temp,其实做的是指针地址赋值而已,这样ch2也指向temp那一块内存 而ch1是一个数组,你要给它赋值

指针-【C语言】为什么指向char整数数组的char*相减得到的是long类型?

问题描述 [C语言]为什么指向char整数数组的char*相减得到的是long类型? 解决方案 事实上, char *p,*p1都是指针,一个指向数组第一个元素,一个指向第五个元素,指针的减法表示地址之间的差,而这是指向char的指针,因此得到的是两地址差/8的值,即sizeof() 解决方案二: 你测试一个问题的时候 把结果贴出来 方便解决 解决方案三: 指针运算得出的结果与指针指向的类型和系统位数有关.比如上述例子:p和p1指针指向的都是char,那么指针运算的单位是一个字节长度. 根据上述