我第一次使用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命令将输出转到循环之外。
答案 0 :(得分:0)
您的代码存在许多问题(除了您的主要问题):
#include <cstdio>
#include <stdio.h>
cstdio
是stdio.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,你不期望多行输入。抛开我认为错误的是期望你的客户终止所有输入句子,并使你的程序行为正常。