无法使用cin.get中断循环来检测句点

时间:2016-02-28 09:22:13

标签: c++ get cin

我第一次使用cin.get一次抓取一个字符串成为字符串“word”。但由于某种原因,我无法将周期设置为退出循环命令。

#include <cstdio>
#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <ctype.h>
#include <string>
using namespace std;

bool isAlpha (char ch);
string replace (string ch);
bool sexist (string ch);

int main()
{
    // Exercise 2
    string word = "";
    string sentence = "";
    char next;
    cout << "Type your sentence " << endl;


    while(next != '.')
    {
        while(true)
        {
            cin.get(next);

            if(isAlpha(next)) // If alphabet then add the char to word
            {
                word = word + next;
            }

            if(isAlpha(next) == false) // If not alphabet then put the char back and stop getting input
            {
                cin.putback(next);
                break;
            }
        }


        if(sexist(word)) // If word is sexist, replace word
        {
            word = replace(word);
        }
        sentence = (sentence + " " + word); // Tacking on words to the sentence

        word = ""; // Resetting word
    }

    cout << "Word = " << word << endl;
    cout << "Sentence = " << sentence << endl;



    return 0;
}

bool isAlpha (char ch)
{
    if(isalpha(ch))
    {
        return true;
    }
    else return false;
}

bool sexist (string ch)
{
    if(ch == "he" || ch == "she")
    {
        return true;
    }
    if(ch == "him" || ch == "her")
    {
        return true;
    }
    if(ch == "his" || ch == "hers")
    {
        return true;
    }
    else
    {
        return false;
    }
}
string replace (string ch)
{
    if(ch == "he" || ch == "she")
    {
        ch = "he or she";
    }
    if(ch == "him" || ch == "her")
    {
        ch = "him or her";
    }
    if(ch == "his" || ch == "hers")
    {
        ch = "his or her(s)";
    }
    return ch;
}

更多地解释我的代码:我试图一次抓住一个单词,一次抓取一个字符,并将任何“性别歧视”的单词改为“中性”。抓住这个词之后,如果是性别歧视,我会改变它,如果不是,那么我就不会改变它,然后将它添加到“句子”字符串中。我希望附加一个句点的最后一个单词突破外部while循环并转到我的最终输出行。

但是在尝试不同的循环和不同的代码后,我无法突破循环。是因为get命令吗?我对C ++非常陌生,所以我可能不了解一些基本规则。我尝试使用bool将外部while循环设置为false,以便在下一个中检测到句点。我已经尝试使用goto命令将输出转到循环之外。

1 个答案:

答案 0 :(得分:0)

您的代码存在许多问题(除了您的主要问题):

#include <cstdio>
#include <stdio.h>

cstdiostdio.h的c ++版本。包含两者都是错误的 - 当你需要包含它时,坚持使用第一个,但在这种情况下你不需要,因为你没有在你的代码中使用任何相关的功能......

然后,为什么要包含所有这些标题?你没有使用它们中的大多数..你只需要这些:

#include <iostream> // for cout/cin
#include <cctype>  // the c++ version of ctype.h, for std::isalpha
#include <string> // for std::string

也不要使用命名空间std !!如果您需要了解原因,可以在stackoverflow中找到许多相关的帖子。

然后,你真的不需要一个isAplha函数,你自己的版本除std::isalpha之外什么都不做,所以为什么不直接使用它?

然后你有这个:

string replace (string ch);
bool sexist (string ch);

首先要注意的是,你要通过值传递std :: string,在这两种情况下你都不应该这样做。在sexist的情况下,您应该通过引用传递给const。但是你真的不需要两个不同的功能..你是复制代码,我会做这样的事情:

void replace (std::string& ch) {
    if(ch == "he" || ch == "she")
        ch = "he or she";
    else if(ch == "him" || ch == "her")
        ch = "him or her";
    else if(ch == "his" || ch == "hers")
        ch = "his or her(s)";
}

然后你可以用更惯用的方式重写你的循环,如下所示:

  while(next != '.') {
    while(std::cin.get(next)) {
      if(std::isalpha(next))
     word = word + next;
      else { 
       cin.putback(next); 
       break;
      }
    }
    replace(word);
  }

有了这个,如果你只使用只有字母值和周期的输入,你就可以了。你无法逃避循环的原因是,当std::isalpha为假时,你将放回角色,以便下次重新读取,这将导致你的程序在同一个{{{{ 1}} ..考虑一个空格不是一个字母字符..因此,一旦到达空间,std::isalpha之类的输入就会振荡。

(顺便说一下,一旦我使用调试器,我就会在30秒内发现这个错误。请使用调试器!它会缩短你的编码寿命)

为了避免这种情况,你需要一个不同的程序方法..我建议使用He is.来读取行而不是字符,然后解析它们,你真的不需要在你的字符中逐个读取case,你不期望多行输入。抛开我认为错误的是期望你的客户终止所有输入句子,并使你的程序行为正常。