Строки с пробелами в списке? - PullRequest
1 голос
/ 28 февраля 2012

У меня есть функция sentanceParse со строковым вводом, который возвращает список.На входе может быть что-то вроде «Здравствуйте, меня зовут Антон. Как вас зовут?»и тогда возвращаемым значением будет список, содержащий «Привет, меня зовут Антон» и «Как тебя зовут?».Однако это не то, что происходит.Кажется, что пробелы в предложениях обрабатываются как разделитель, и поэтому возвращаемое значение скорее «Hello», «my», «name» и т. Д. Вместо того, что я ожидал.

Как бы вы предложили, чтобы я решил эту проблему?

Поскольку я не уверен на 100%, что проблема не в моем коде, я добавлю это и к сообщению:

Main:

list<string> mylist = sentanceParse(textCipher);
list<string>::iterator it;
for(it = mylist.begin(); it != mylist.end(); it++){
    textCipher = *it;
    cout << textCipher << endl; //This prints out the words separately instead of the entire sentances.

sentanceParse:

list<string> sentanceParse(string strParse){
    list<string> strList;
    int len = strParse.length();
    int pos = 0;
    int count = 0;
    for(int i = 0; i < len; i++){
        if(strParse.at(i) == '.' || strParse.at(i) == '!' || strParse.at(i) == '?'){
            if(i < strParse.length() - 1){
                while(i < strParse.length() - 1 && (strParse.at(i+1) == '.' || strParse.at(i+1) == '!' || strParse.at(i+1) == '?')){
                    if(strParse.at(i+1) == '?'){
                        strParse.replace(i, 1, "?");
                    }
                    strParse.erase(i+1, 1);
                    len -= 1;
                }
            }
            char strTemp[2000];
            int lenTemp = strParse.copy(strTemp, i - pos + 1, pos);
            strTemp[lenTemp] = '\0';
            std::string strAdd(strTemp);
            strList.push_back(strAdd);
            pos = i + 1;
            count ++;
        }
    }

    if(count == 0){
        strList.push_back(strParse);
    }

    return strList;
}

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Ваша реализация разбора предложения неверна, вот более простое правильное решение.

std::list<std::string> sentence_parse(const std::string &str){
    std::string temp;
    std::list<std::string> t;

    for(int x=0; x<str.size();++x){
       if(str[x]=='.'||str[x]=='!'||str[x]=='?'){
           if(temp!="")t.push_back(temp);//Handle special case of input with
                                         //multiple punctuation Ex. Hi!!!!
           temp="";
       }else temp+=str[x];
    }
    return t;
}

EDIT:

Вот полный пример программы, использующей эту функцию. Введите несколько предложений в консоли, нажмите ввод, и они будут выделены предложениями с новой строкой, разделяющей их вместо знаков препинания.

#include <iostream>
#include <string>
#include <list>
std::list<std::string> sentence_parse(const std::string &str){
    std::string temp;
    std::list<std::string> t;

    for(int x=0; x<str.size();++x){
        if(str[x]=='.'||str[x]=='!'||str[x]=='?'){
            if(temp!="")t.push_back(temp);//Handle special case of input with
                                          //multiple punctuation Ex. Hi!!!!
            temp="";
        }else temp+=str[x];
    }
    return t;
}
int main (int argc, const char * argv[])
{
    std::string s;

    while (std::getline(std::cin,s)) {       
        std::list<std::string> t= sentence_parse(s);
        std::list<std::string>::iterator x=t.begin();
        while (x!=t.end()) {
             std::cout<<*x<<"\n";
            ++x;
        }

    }

    return 0;
}
0 голосов
/ 28 февраля 2012
// This function should be easy to adapt to any basic libary
// this is in Windows MFC
// pass in a string, a char and a stringarray
// returns an array of strings using char as the separator

void tokenizeString(CString theString, TCHAR theToken, CStringArray *theParameters)
{
    CString temp = "";
    int i = 0;

    for(i = 0; i < theString.GetLength(); i++ ) 
    {                                   
        if (theString.GetAt(i) != theToken) 
        {
            temp += theString.GetAt(i); 
        }
        else
        {
            theParameters->Add(temp);   
            temp = "";
        }
        if(i == theString.GetLength()-1)
            theParameters->Add(temp);
    }
}
...