`
waret
  • 浏览: 139550 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

关于while(cin>>str)无法结束的问题

阅读更多
    在 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。
分享到:
评论

相关推荐

    浅谈c++中的while(cin)问题

    xp系统中利用dev-cpp进行编程,语句while(cin>>str),str是个string类型,在一行中输入几个string,末位加个ctrl+z,输入没有结束,除非出入换行后,再输入ctrl+z才能跳出输入。一直不明白未什么,解释请看下。 输入...

    图书管理系统.doc

    cin >> str; while (!check(str)) { cout 输入的不是数字,请重新输入" ; cin >> str; } p1->num = atoi(str.c_str()); if (p1->num != 0) { // 输入图书价格 cout 请输入图书的价格000--以0结束;" ; ...

    词法分析器

    char keyword[][5]={"DIM","IF","DO","STOP","END"}; char str[S],id[50],s[25];... cin>>choice; while(choice!=1&&choice!=2) { cout警告 !输入不合法,重新新输入!\n"; cin>>choice; }

    电话簿(c++编写的,初学者可以看一下)

    cin>>newnode->workplace; cout家庭电话:\n"; cin>>newnode->hometel; cout移动电话:\n"; cin>>newnode->mobiletel; newnode->next=NULL; }//if else{ Node *temp; temp=new Node; tail->...

    电话簿管理(c++编的,适用于初学者)

    cin>>newnode->workplace; cout家庭电话:\n"; cin>>newnode->hometel; cout移动电话:\n"; cin>>newnode->mobiletel; newnode->next=NULL; }//if else{ Node *temp; temp=new Node; tail->...

    通讯录程序题

    while (inData >> name >> number) { getline(inData, str); if ((sign == name) || (sign == number)) { cout 删除联系人:" ; cout << str1 ; cout (17) << left << name << "" << number << str ; flag = ...

    信奥赛c++程序算法篇100题

    cin >> str1 >> str2; if(str1 == str2) { cout 字符串相同" ; } else { cout 字符串不同" ; } return 0; } ``` **1478. 出现次数最多的小写字母** - **知识点**:字符串统计。本题要求找出出现次数...

    用vs2008实现的简单字符串处理程序

    std::cin >> replace; findAndReplace(input, find, replace); std::cout 请输入要插入的子串: "; std::cin >> insert; size_t pos; std::cout 请输入插入位置: "; std::cin >> pos; insertString(input, ...

    算术编码的C语言程序

    cin >> str; Arithmetic(); } else if (i == 2) { cout 输入译码的数字\n"; cin >> num; decoding(); } ``` #### 三、总结 算术编码作为一种高效的压缩算法,其原理在于利用符号的出现概率来减少冗余,实现...

    ACM一些基本信息

    while (cin >> a >> b) cout ; return 0; } ``` **说明**:`scanf` 函数返回的是成功读取的数据项的数量,如果没有读取到任何数据则返回 `EOF`。 ##### 3. 多组输入数据,以特定条件结束 这种情况下,题目同样...

    C++ primer第五版练习11.1.4

    C++初学者,分享一下想法。 单词计数程序。 从输入流中读取单词并计数,同一个单词的大小写算一个单词,忽略常见单词。 #include #include ... while (cin >> str) { if (exclude.find(str) == exclude.en

    c++实验报告.docx

    cin>>a>>b;cout它们的最小公倍数为:"(a,b);}程序运行结果:任务二:2、设计程序,使用函数实现字符串的反转。源程序:#include<iostream.h>void reverse(char str[],int len){char temp;for(int i=0;i

    C++ 程序设计

    该问题是关于国际象棋中的不同棋子如何在棋盘上移动。具体来说,题目要求计算从一个位置到另一个位置时,各种棋子(如王、后、车、象)需要走多少步。 **示例代码分析**: ```cpp #include<iostream> using ...

    20120320_得出“15选5”的各种组合(组合生成算法)1

    cin>>str; vstr.push_back(str); } //简单检查数据 while(num > szvstr or num ==0 ) { cout; cin>>num; } unsigned int counter = 1; counter ; int szUnsign = sizeof(unsigned int) * 8; int total...

    C++通讯录管理系统

    while (inData >> name >> number) { getline(inData, str); if ((sign == name) || (sign == number)) { cout 你想删除的联系人:" << str1 (17) << "" << number << str ; flag = false; break; } ...

    字符串的操作演示程序的实现

    cin >> s.s; s.len = strlen(s.s); } ``` #### 2. 子字符串提取 接下来,通过`SubString`函数可以实现从一个字符串中提取出一个子字符串。这个函数接受原字符串`s`、需要提取的子字符串的长度`n`以及目标子字符...

    C++通讯录 简单版

    cin >> str; cout (str, p, num); delete[] str; delete[] p; } ``` 主函数是程序的入口,首先通过循环获取用户想要添加的联系人数量,然后创建相应大小的`Person`对象数组,并调用`InsertPerson`函数填充数据...

    c++实现算术编码-数据压缩

    cin >> str; int idx = 0; while (str[idx]) { for (int i = 0; i ; i++) { if (str[idx] == code[i]) { high = low + range * rangeHigh[i]; low = low + range * rangeLow[i]; range = high - low; ...

    CPP经典代码大全

    cin >> str; cout << "str=" << str ; cout ; *(strip + 2) = 'l'; cout << "str=" << str ; cout ; strip = new char[100]; cout ; cin >> strip; cout << "str=" << str ; cout ; } ``` 通过这些...

    c++指针类编程题学生用.doc

    cin >> str; int len; len = strlen(str); char *p = &str[len - 1]; while (p >= str) { cout *p; p--; } cout ; return 0; } ``` **知识点解析**: 1. **字符串长度计算**:`strlen`函数返回字符串的...

Global site tag (gtag.js) - Google Analytics