列表中有空格的字符串?

时间:2012-02-28 01:29:13

标签: c++ string list whitespace

我有这个函数sentanceParse,带有一个返回列表的字符串输入。输入可能是“你好我的名字是安东。你叫什么名字?”然后返回值将是一个包含“Hello my name is Anton”和“你叫什么名字?”的列表。然而,这不是发生的事情。似乎句子中的空格被视为分隔符,因此返回的是“Hello”,“my”,“name”等,而不是我所期望的。

你怎么建议我解决这个问题?

由于我不是100%确定问题不在我的代码中,我也会将其添加到帖子中:

主:

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 个答案:

答案 0 :(得分:1)

你的句子解析的实现是错误的,这是一个更简单的正确解决方案。

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;
}

编辑:

这是使用此功能的完整示例程序。在你的控制台中键入一些句子,按回车键,它会用新行分隔出句子而不是标点符号。

#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;
}

答案 1 :(得分:0)

// 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);
    }
}