Получение некоторого мусора, возвращаемого функцией - PullRequest
0 голосов
/ 19 сентября 2018

Я участвовал в различных конкурсах по кодированию и поэтому не могу использовать python, потому что он слишком медленный по времени выполнения, но мне очень нравится функция input.split (), поэтому я попытался реализовать свой собственный сплит.Вот что я придумал:

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

vector<string> splt(string s){
    vector<string> ans={};
    for(int i=0;i<s.size();i++){
        string str="";
        while(s[i]!=' '){
            str+=s[i];
            i++;
        }
        ans.push_back(str);
    }
    return ans;
}

int main(){
    string s;
    getline(cin, s);
    vector<string> ans=splt(s);
    for(auto i:ans)
        cout<<i<<", ";
}

Но вектор, возвращаемый функцией часто (но не всегда), имеет в конце некоторый мусор.Буду признателен за любую помощь в исправлении моего кода, а также за некоторые другие способы разделения строки в массив.

PS Извините, если мой английский плохой, я из России и даже не закончил школу :)1006 *

Ответы [ 4 ]

0 голосов
/ 19 сентября 2018

Ваш цикл while не проверяет конец строки, поэтому, если вы достигнете последнего пробела в строке, он не остановится на последнем символе.

while(s[i]!=' ' && i<s.size()){

Вероятно, умнееиспользуйте решение, используя потоки из другого ответа, или используйте метод find класса string и метода substring.Пример:

vector<string> splt(string s){
    vector<string> ans={};
    size_t found = s.find_first_of(' ');
    size_t last = 0;
    while(found!=string::npos){
        ans.push_back(s.substr(last,found));
        last = found+1;
        found = s.find_first_of(' ',found+1);
    }
    ans.push_back(s.substr(last,s.size()));
    return ans;
}
0 голосов
/ 19 сентября 2018

Ваш внутренний цикл не останавливается в конце строки, только когда встречается с пробелом.
Таким образом, если ваш ввод не заканчивается пробелом, вы собираетесь индексировать вне строкии имеют неопределенное поведение.
(И когда это работает, непрерывные пробелы приводят к пустым строкам, которые вы, вероятно, не хотите.)

Самый простой способ разделения на пробельные символы - это использоватьпоток:

#include <sstream>

vector<string> split(string s){
    vector<string> ans;
    istringstream ss(s);
    string word;
    while (ss >> word)
        ans.push_back(word);
    return ans;
}

или

#include <algorithm>
#include <iterator>
#include <sstream>

vector<string> split(string s){
    vector<string> ans;
    istringstream ss(s);
    copy(istream_iterator<string>(ss), istream_iterator<string>(), back_inserter(ans));
    return ans;
}
0 голосов
/ 19 сентября 2018
while(s[i]!=' '){
        str+=s[i];
        i++;
}

Приведенная выше часть кода не проверяет границы s.При выполнении i++ вы можете перейти через границу строки.Поэтому проверьте, если i == s.size() и оторваться от цикла.

0 голосов
/ 19 сентября 2018

В этом цикле:

    while(s[i]!=' '){
        str+=s[i];
        i++;
    }

Вы никогда не проверяете, находится ли i за пределами s, и пока там нет ' ', i будетувеличивается за пределы границы, и строка будет доступна за пределами границ.Поведение доступа к строке за пределами границ не определено.

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