Поиск и удаление слов в строковом предложении - PullRequest
0 голосов
/ 14 января 2020

В качестве задания я должен написать функцию на C ++, которая удаляет слово в предложении. Нам дано само предложение в виде строки std::string sentence и номер удаляемого слова int place.

Между словами может быть несколько пробелов, и предложение может заканчиваться и начинаться с пробелов.

Например: DeleteWord("Fox jumped over lazy dog", 2) должен вернуть: "Fox over lazy dog".

Проблема в том, что я могу использовать только std :: string size () и resize ().

Я также должен удалить только слово, а не пробелы вокруг него.

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

У вас есть идеи, как решить эту проблему? Спасибо!

Пока мой код:

std::string DeleteWord(std::string sentence, int place){

    std::string retvalue;

    long long wordcounter = 0;
    long long spacecounter = 0;
    long long spacescounter = 0;

    int i = 0;
    int index = 0;

    for(int i=0; i<sentence.size(); i++){
        if((sentence[i]==' ') && (sentence[i+1]!=' ')) spacecounter++;
    }

    for(int i=0; i<sentence.size(); i++){
        if(sentence[i]==' ') spacescounter++;
    }

    std::string words[spacescounter+1];

    while(i<sentence.size()){
        if(sentence[i]!=' '){
            words[index] += sentence[i];
            i++;
        }
        else{
            index++;
            i++;
        }
    }

    sentence[place-1] = ' ';

    for(int i=0; i<=index; i++){
        retvalue+=words[i] + ' ';
    }

    return retvalue;
}

Ответы [ 3 ]

1 голос
/ 14 января 2020

Вам не нужно считать пробелы или слова. Вам не нужно хранить слова в массиве.

Перебирать предложение и уменьшать place, если предыдущий элемент является пробелом, а текущий - не пробелом. Если place равно 0, вам нужно пропустить слово. В противном случае скопируйте строку в возвращаемую строку. Как я уже говорил в комментариях, это просто: l oop, одна переменная, 3 условия:

#include <iostream>
#include <string>

std::string DeleteWord(const std::string &sentence, int place){
    if (sentence.empty()) {
        return std::string();
    }

    auto isPreviousSpace = std::isspace(sentence[0]);
    if (!isPreviousSpace) {
        --place;
    }

    std::string retvalue;    
    for (const auto &c : sentence) {
        if (isPreviousSpace && !std::isspace(c)) {
            --place;
        }
        if (place != 0 || std::isspace(c)) {
            retvalue += c;
        }
        isPreviousSpace = std::isspace(c);
    }

    return retvalue;
}

int main()
{
    std::cout << DeleteWord("Fox   jumped  over lazy dog", 2);
    // Output is: "Fox     over lazy dog"
    return 0;
}

Решение C ++ 98 без std::isspace и без аргумента const ref:

#include <iostream>
#include <string>

std::string DeleteWord(std::string sentence, int place){
    if (sentence.empty()) {
        return std::string();
    }

    bool isPreviousSpace = sentence[0] == ' ';
    if (!isPreviousSpace) {
        --place;
    }

    std::string retvalue;    
    for (unsigned int index = 0; index < sentence.size(); ++index) {
        if (isPreviousSpace && sentence[index] != ' ') {
            --place;
        }
        if (place != 0 || sentence[index] == ' ') {
            retvalue += sentence[index];
        }
        isPreviousSpace = sentence[index] == ' ';
    }

    return retvalue;
}

int main()
{
    std::cout << DeleteWord("Fox   jumped  over lazy dog", 2);
    // Output is: "Fox     over lazy dog"
    return 0;
}
0 голосов
/ 14 января 2020

Я проверил слова в массиве char, проверив пробелы, и удалил слова, изменив позицию '\ 0' (конечная строка) o, сдвинув массив

#include <string>
#include <iostream>
#include <string.h>
//#include <stdio.h>

using namespace std;
string DeleteWord(string a,int index)
{
    int length=a.size();
    int pos;
    int word=1;
    char* s;
    s=new char[length];
    strcpy(s,a.c_str());
    for(int i=0; i<length; i++)
    {
        if(s[i]==' ' and i!=0 and s[i-1]!=' ')
            word++;
    }
    if(index>word)
    {
      delete [] s;
        return "error";
     }
    else
    {
        if(index==word)
        {
            pos=0;
            for(int i=length-1; i>=0; i--)
            {
                if(s[i]==' ')
                {
                    pos=i+1;
                    break;
                }
            }
            s[pos]='\0';
        }
        else
        {
            int wl=0;
            char pre=' ';
            word=0;
            pos=-1;
            bool found=false;
            for(int i=0; i<length; i++)
            {
                if(pre==' ' and s[i]!=' ')
                {
                    word++;
                    if(word==index){
                        found=true;
                        pos=i;
                    }
                }
                if(found==true)
                {
                    if(s[i]==' '){
                        break;
                        }
                    else
                        wl++;
                }

                pre=s[i];
            }
            for(int i=pos; i<length; i++)
                s[i]=s[i+wl];
        }
        string f=string (s);
        delete[] s;
        return string(f);
    }

}
int main()
{
    string str="Fox   jumped  over  lazy dog";
    cout<<DeleteWord(str,4)<<endl;
    return 0;
}
0 голосов
/ 14 января 2020

Найти начальный и конечный индексы слова нужно удалить, я называю это s и e соответственно, результат будет: sentence[0:s-1] + sentence[e+1->sentence.size()-1]. Я предполагаю, что входное значение place будет действительным (больше нуля и равно или меньше количества слов в предложении). Вы можете попробовать с моим кодом:

#include <iostream>
#include <string>
#include <map>
using namespace std;

pair<int,int> startAndEndIndexOfWord(string sentence, int place){
    pair<int,int> startAndEnd;

    int currentWordIndex = 0;
    int startIndex = 0;
    int endIndex = 0;
    for(int i=0;i<sentence.size();i++){
        //meet a word
        if(sentence[i]!=' '){
            currentWordIndex += 1;
            if(currentWordIndex==place){//if it is the word need to be delete
                startIndex = i;
                //find ending index
                endIndex = sentence.size()-1; //just a default value
                for(int j=i+1;j<sentence.size();j++){
                    if(sentence[j]==' '){
                        endIndex = j-1;
                        break;
                    }
                }
                startAndEnd.first = startIndex;
                startAndEnd.second = endIndex;
                return startAndEnd;
            }
            else{
                i+=1;
                while(sentence[i]!=' ') i++; //ignore the current word
            }
        }
    }
}
string deleteWord(string sentence, int place){
    string result;
    pair<int,int> startAndEndIndex = startAndEndIndexOfWord(sentence,place);
    for(int i=0;i<startAndEndIndex.first;i++){
        result+=sentence[i];
    }
    for(int i=startAndEndIndex.second+1;i<sentence.size();i++){
        result+=sentence[i];
    }
    return result;
}
int main() {
    int place = 5;
    string sentence = "Fox   jumped  over lazy dog";
    string result = deleteWord(sentence,place);

    cout<<result;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...