今天在练习的时候突然发现了这个问题,百度之感觉还挺常见的,故记之!

  1. //题目描述
  2. //
  3. //写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。
  4. //
  5. //输入描述 :
  6. //输入一个十六进制的数值字符串。
  7. //
  8. //
  9. //输出描述 :
  10. //输出该数值的十进制字符串。
  11.  
  12. #include<iostream>
  13. #include<string>
  14. using namespace std;
  15.  
  16. void fun(string str)
  17. {
  18. if (str.empty())
  19. {
  20. return;
  21. }
  22. ;
  23. ,n=;
  24. //while (str[i++] != 'x'); //读到x的下一个字符
  25. ;
  26.  
  27. while (str[len]!='x') //如果没有x,一直减下去,有错
  28. {
  29. if (str[len]<='Z'&&str[len]>='A')
  30. j = str[len] - ; //字符转化为整形
  31. else
  32. {
  33. j = str[len] - ';
  34. }
  35. result = j*n + result;
  36. n =n*;
  37. len--;
  38. )
  39. {
  40. break;
  41. }
  42. }
  43. cout << result << endl;
  44. }
  45. int main()
  46. {
  47. string str;
  48. // while (cin>>str) //死循环居然也通过了 //说在windows下输入ctrl+Z即退,有时按两次,
  49. //{
  50. // fun(str);
  51. //}
  52.  
  53. //cin >> str;
  54. //while (str!=" ") //解决死循环,貌似没有
  55. //{
  56. // fun(str);
  57. // cin >> str;
  58. //}
  59.  
  60. //istream& getline(istream& is, string& str, char delim); //返回值是istream类型,不能作为while退出的判断条件
  61. //istream& getline(istream& is, string& str);
  62. //Return Value
  63. // The same as parameter is.
  64. getline(cin,str);
  65. while (str != " ") //解决死循环,空格键退出
  66. {
  67. fun(str);
  68. getline(cin, str);
  69. }
  70. ;
  71. }
  72. //
  73. //#include<iostream>
  74. //#include <vector>
  75. //#include <string>
  76. //using namespace std;
  77. //int main()
  78. //{
  79. // vector<string> vect;
  80. // string str;
  81. // while (cin >> str)
  82. // {
  83. // if (str == "0") //这种方式也可以退出
  84. // break;
  85. // vect.push_back(str);
  86. // }
  87. // return 0;
  88. //}

解释有:

在 C++Primer 中,作者经常使用 while(cin>>word) 类似的语法,但是如何结束,可能会出现疑惑。有的时候需要两次快捷键才能结束循环,有的时候却只需要一次循环。

    在 Unix 系统中的实际的现象为:
    * 当输入为“字符串,回车,Ctrl+D”的时候,跳出循环;
    * 当输入为“字符串,Ctrl+D,回车”的时候,不会跳出循环;
    * 当输入为“字符串,Ctrl+D,回车,Ctrl+D”的时候,跳出循环;
    * 当输入为“字符串,Ctrl+D,Ctrl+D”的时候,跳出循环;
    在 Windows 系统中的实际现象待考察。
    具体原因解释如下:
    输入(cin)缓冲是行缓冲。当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin 就会检测输入缓冲区中是否有了可读的数据。
    cin 还会对键盘上是否有作为流结束标志的 Ctrl+Z 或者 Ctrl+D 键按下作出检查,其检查的方式有两种:阻塞式以及非阻塞式。
    阻塞式检查方式指的是只有在回车键按下之后才对此前是否有 Ctrl+Z 组合键按下进行检查,非阻塞式样指的是按下 Ctrl+D 之后立即响应的方式。如果在按 Ctrl+D 之前已经从键盘输入了字符,则 Ctrl+D的作用就相当于回车,即把这些字符送到输入缓冲区供读取使用,此时Ctrl+D不再起流结束符的作用。如果按 Ctrl+D 之前没有任何键盘输入,则 Ctrl+D 就是流结束的信号。
    阻塞式的方式有一个特点:只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下。还有一个特点,如果输入缓冲区中有可读的数据则不会检测 Ctrl+Z(因为有要读的数据,还不能认为到了流的末尾)。还有一点需要知道,Ctrl+Z产生的不是一个普通的ASCII码值,也就是说它产生的不是一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区。
    Windows系统中一般采用阻塞式检查 Ctrl+Z、Unix/Linux系统下一般采用非阻塞式的检查 Ctrl+D。

while (cin&gt;&gt;str)退出死循环的更多相关文章

  1. while (cin>>str)退出死循环

    今天在练习的时候突然发现了这个问题,百度之感觉还挺常见的,故记之! //题目描述 // //写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串. // //输入描述 : //输入一个 ...

  2. c#跨线程访问的代码和窗体关闭退出死循环的代码

    一:一段跨线程访问,给页面内的控件赋值的代码找了半天没找到,还得找了以前写的程序. 在这记下来吧 .  这是其他程序内可以跨线程访问的代码 . if (gridControl1.InvokeRequi ...

  3. cin详解(cin.get()、cin.getline()、cin.clear()、cin.sync())

    在C中,输入输出用scanf和printf,在输入数据的同时还需说明数据的类型,如果输入数据较多,那就很麻烦,而C++中也有相似的东西cin和cout,它们来自C++的一个名叫" iostr ...

  4. cin详解(get()、getline()、clear()、sync())

    简述 在C中,输入输出用scanf和printf,在输入数据的同时还需说明数据的类型,如果输入数据较多,那就很麻烦,而C++中也有相似的东西cin和cout,它们来自C++的一个名叫" io ...

  5. C++中几种输入输出cin、cin.getline()、getline()、sscanf()、sprintf()、gets()等

    1.cin和cout cout是输出流对象的名字,cin是输入流对象的名字 ,“<<”是流插入运算符(也可称流插入操作符〉,作用是将需要输出的内容插入到输出流中,默认的输出设备是显示器. ...

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

    我们谈谈cin.clear的作用,第一次看到这东西,很多人以为就是清空cin里面的数据流,而实际上却与此相差很远,首先我们看看以下代码: #include <iostream>  usin ...

  7. cin输入bug

    我们先来谈谈cin.clear的作用,第一次看到这东西,很多人以为就是清空cin里面的数据流,而实际上却与此相差很远,首先我们看看以下代码: #include <iostream> usi ...

  8. C++中cin的用法汇总

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

  9. getchar()、putchar()、gets()、puts()、cin.get()、cin.getline()、getline()

    1.getchar: 原型为int getchar(void). 它从stdin里读取一个字符.返回值为用户输入的ASCⅡ码,出错返回-1. eg:c=getchar(). 2.putchar: 原型 ...

随机推荐

  1. Maven系列--"maven-compiler-plugin"的使用、Maven之Surefire插件

    一."maven-compiler-plugin"的使用 http://my.oschina.net/poorzerg/blog/206856 二.Maven之Surefire插件 ...

  2. 使用Flexbox实现CSS竖向居中

    竖向居中需要一个父元素和一个子元素合作完成. <div class="flexbox-container"> <div>Blah blah</div& ...

  3. ASP.NET MVC 数据分页思想及解决方案代码

    作为一个程序猿,数据分页是每个人都会遇到的问题.解决方案更是琳琅满目,花样百出.但基本的思想都是差不多的. 下面给大家分享一个简单的分页器,让初学者了解一下最简单的分页思想,以及在ASP.NET MV ...

  4. AndroidManifest.xml文件综合详解(转)

    一,重要性AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目 ...

  5. 如何在CHROME里调试前端代码?

    以前看前端们调得很神的, 刚看书到这里,作一个记录,演练了一下,确实有点神!!! :) <!DOCTYPE html> <html lang="en"> & ...

  6. IText 生成横向的doc文档

    IText生成doc文档需要三个包:iTextAsian.jar,iText-rtf-2.1.4.jar,iText-2.1.4.jar 亲测无误,代码如下: import com.lowagie.t ...

  7. redis其他问题

    如何解决redis高并发客户端频繁time out? 现在业务上每天有5亿+的请求,平时redis的操作在2K+每秒左右.到了高峰有3K+,这时候客户端就会频繁的报connect time out的异 ...

  8. IDirect3DDevice9::GetRenderTargetData

    翻译自DXSDK 将渲染目标数据从设备内存拷贝到系统内存. HRESULT GetRenderTargetData(  [in]  IDirect3DSurface9 *pRenderTarget,  ...

  9. dynamic_cast 用法

    dynamic_cast < type-id > ( expression ) 该运算符把expression转换成type-id类型的对象.Type-id必须是类的指针.类的引用或者vo ...

  10. POJ3660——Cow Contest(Floyd+传递闭包)

    Cow Contest DescriptionN (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a prog ...