C ++ найти специальный символ и перейти к концу строки

В настоящее время я учусь на 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;
}
}

У меня есть другие функции, но они работают и просто переводят слово в пиглатин.

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...
}
}
}
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 )
{
...
}
}

Как правило, нет ничего плохого в написании кода таким образом, чтобы вам было понятнее, что происходит, при компиляции и оптимизации все будет, вероятно, одинаково.

0

По вопросам рекламы [email protected]