-1

有谁能够帮助我?在代码中,我没有像显示的那样擦除标点符号,而是需要将其剥离以便稍后在它之前的单词从其缩写形式扩展时重新使用。任何帮助将不胜感激。NB 这只是代码的一个功能,显示矢量和打开 infile 等...已放置在单独的功能中。

void readText2(ifstream &infile, vector <string> &textFile2 ) 
{
    while( !infile.eof() )
    {
        string fileWord;
        infile >> fileWord;
        for (size_t i=0; i !=fileWord.length(); i++)
        {
            fileWord[i]=toupper(fileWord[i]);
        }

        for (size_t i=0; i < fileWord.length(); i++)
        {
            if (ispunct (fileWord[i]))
            {
                fileWord.erase(i); 
            }
        }
        textFile2.push_back(fileWord);
    }
    infile.close();
}
4

1 回答 1

0

我建议从头到尾遍历字符串(以保留正确的索引号),并在循环内将索引+标点符号存储在 std::map<size_t,char>

你的函数被黑了,评论改变了:

// changed return type
vector<map<size_t,char>> readText2(ifstream &infile, vector <string> &textFile2 ) 
{
    vector<map<size_t,char>> vPunct;    // added

    while( !infile.eof() )
    {
        string fileWord;
        infile >> fileWord;
        for (size_t i=0; i !=fileWord.length(); i++)
        {
            fileWord[i]=toupper(fileWord[i]);
        }

        map<size_t,char> mPunct;        // construct a map
                                        // map stays empty if no punctuation is found

        for (size_t i=fileWord.length()-1; i>=0 ; i--)    // reversed loop
        {
            if (ispunct (fileWord[i]))
            {
                // store index + punctuation char
                mPunct.insert(pair<size_t,char>(i,fileWord[i]));     
                fileWord.erase(i); 
            }
        }
        textFile2.push_back(fileWord);      
        vPunct.push_back(mPunct);      // add map to vector
    }
    infile.close();
    return vPunct;   // return vector
}

标点符号现在存储在函数返回的第二个向量中。例如: textFile[20] 处的字符串将其标点符号存储在 vPunct[20] 中。

将标点符号与字符串一起存储在一个中会更可靠vector<pair<string,map<size_t,char>>>,但这会改变函数的外部行为,我不知道这是否适合您。

于 2013-03-31T23:18:25.927 回答