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

0

В настоящее время я студент, принимающий 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;
}

Функция, которая перечисляет специальные символы, ниже

bool specialChar(char ch) {
    switch(ch) {
    case ',':
    case ':':
    case ';':
    case '.':
    case '?':
    case '!':
        return true;
    default:
        return false;
    }
}

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

  • 0
    кроме вашего вопроса, вы пытаетесь создать парсер ?
  • 1
    Не могли бы вы объяснить, что вы имеете в виду, if(specialChar(str[true])) в частности, аргумент str[true] ?
Показать ещё 7 комментариев
Теги:
string
boolean-expression
boolean-operations

2 ответа

0

ваш isSpecialChar принимает символ как аргумент, поэтому str [index] будет тем, что вы могли бы передать, но вместо этого вы написали str [true], что неверно. Если вы хотите проверить, есть ли специальный символ в вашей строке, вам нужно пропустить всю строку и проверить каждый символ.

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

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
    Это имеет смысл .... как я могу вернуть true / false при переходе от строки к символу?
  • 1
    Вы используете позицию символа, который хотите исследовать, в качестве строкового индекса. Функция specialChar() принимает этот символ в качестве аргумента и возвращает bool (true или false), потому что его тип возврата - bool, а не из-за аргументов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню