我目前是一名学习C ++的学生。我的问题是我的嵌套if语句如果它们位于单词的末尾则找不到特殊的字符。据我所知,它根本不运行该功能。如果有人知道什么是错的那就太棒了!
#include <iostream>
#include <string>
using namespace std;
bool isVowel(char ch);
string rotate(string pStr);
string pigLatinString(string pStr);
bool specialChar(char ch);
int main() {
string str, str2, pigsentence, finalsentence, orgstr, end;
int counter, length, lengtho;
counter = 1;
cout << "Enter a string: ";
getline (cin, str);
cout << endl;
orgstr = str;
//Add in option to move special chars
string::size_type space;
do {
space = str.find(' ', 0); //Finds the space(s)
if(space != string::npos){
str2 = str.substr(0, space); //Finds the word
if(specialChar(str[true])) { //Finds special char
end = str.substr(space - 1); //Stores special char as end
cout << end << endl; //Testing end
str.erase(space - 1); //Erases special car
}
str.erase(0, space + 1); //Erases the word plus the space
pigsentence = pigLatinString(str2); //converst the word
finalsentence = finalsentence + " " + pigsentence + end; //Adds converted word to final string
}else {
length = str.length();
str2 = str.substr(0, length); //Finds the word
if(specialChar(str[true])) { //Finds special char
end = str.substr(space - 1); //Stores special char as end
cout << end << endl; //Testing end
str.erase(space - 1); //Erases special car
}
str.erase(0, length); //Erases the word
pigsentence = pigLatinString(str2); //converst the word
finalsentence = finalsentence + " " + pigsentence + end; //Adds converted word to final string
counter = 0;
}
}while(counter != 0); //Loops until counter == 0
cout << "The pig Laten form of " << orgstr << " is: " << finalsentence << endl;
return 0;
}
列出specialChars的功能在
下面bool specialChar(char ch) {
switch(ch) {
case ',':
case ':':
case ';':
case '.':
case '?':
case '!':
return true;
default:
return false;
}
}
我确实有其他功能,但它们正在工作,只是将一个单词转换为piglatin。
答案 0 :(得分:0)
将参数传递给true
函数时,您使用specialChar()
作为数组索引!当然这不是你想要做的。解决这个问题,你可能会看到一些改进。
想一下像这样分解的函数调用,以帮助您跟踪类型:
// takes a char, returns a bool, so....
bool specialChar( char in )
{ ... }
for( int i = 0; i < str.size(); i++ )
{
char aChar = str[i];
// ...pass in a char, and receive a bool!
bool isSpecial = specialChar(aChar);
if( isSpecial )
{
...
}
}
编写代码的方式通常没有什么害处,这使得更清楚地了解正在发生的事情,在编译和优化时它们都可能是相同的。
答案 1 :(得分:0)
你的isSpecialChar将一个字符作为参数,因此str [index]将是你可以传递的东西,而是你写str [true]这是不正确的。如果你想检查字符串中是否有specialChar,你需要遍历整个字符串并检查每个字符。
好像你想把一个字符串拆分成单词,这样就可以编写类似这样的东西了
char Seperator = ' ';
std::istringstream StrStream(str);
std::string Token;
std::vector<std::string> tokens;
while(std::getline(StrStream, Token, Seperator))
{
tokens.push_back(Token);
}
现在你有了矢量中的单词,你可以随心所欲地做任何事情 和他们一样检查特殊字符
for (int i = 0; i < tokens.size(); ++i)
{
std::string& s = tokens[i];
for (int j = 0; j < s.length(); ++j)
{
if ( specialChar( s[j] )
{
...do whatever...
}
}
}