簡體   English   中英

在C ++中刪除字符串元素

[英]Deleting string elements in C++

我必須輸入一個整數,然后輸入一個帶有n個元素的字符串,整數類型; 任務是刪除重復元素。 我試圖用此代碼解決問題,但不知道錯誤在哪里。 你能幫助我嗎?

#include <iostream>
#include <string>

using namespace std;
int main()
{
    int n, br=0;

    string masiv;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>masiv[i];
    }
    n=masiv.size();
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(masiv[i]==masiv[j] && i!=j)
            {
                masiv.erase (std::remove(masiv.begin(), masiv.end(), masiv[i]), masiv.end());
            }
        }
    }
    cout<<masiv<<endl;
    system("pause");
    return 0;
}

使用此代碼代替:

    #include <iostream>
    #include <string>

    using namespace std;
    int main()
    {
        int n, br=0;

        string masiv="";
        cin>>n;
        for(int i=0;i<n;i++)
        {
            char c;
            cin>>c;
            masiv += c;
        }
        n=masiv.size();
        string result="";
        for(int i=0;i<n;i++)
        {
            bool repeated = false;
            for(int j=0;j<result.size();j++)
            {
                if(masiv[i]==result[j])
                {
                    repeated = true; // indicating that massiv[i] was added before
                }
            }
            if(repeated == false)
            {
                result += masiv[i]; // won't add masiv[i] to the result unless it's the first time encountered 
            }
        }
        cout<<result<<endl;
        system("pause");
        return 0;
    }

首先,您應該將輸入讀取為字符,然后使用push_back()將讀取的字符保存到字符串中。

cin>>n;
for(int i=0;i<n;i++)
{
    char c;
    cin>>c;
    masiv.push_back(c);
}

之所以會出現分段錯誤,是因為將字符串的大小保存為值n( n=masiv.size(); ),這是不應該的,因為一旦從字符串中刪除了元素,其大小就會改變。 因此,您應該對循環邊界使用size()方法,如下所示。

for(int i=0;i<masiv.size();i++)
{
    for(int j=0;j<masiv.size();j++)
    {
        if(masiv[i]==masiv[j] && i!=j)
        {
            masiv.erase(j, 1);
            j--;
        }
    }
}

看到一個簡單的erase()方法? 只需擦除重復的元素(后一個)。 j指定重復元素的索引,並且1指定將從該索引開始刪除的字符數。 您必須遞減j因為一旦刪除了第j個索引處的字符,現在j就會指向下一個字符。 當內部循環繼續時,它將遞增j 如果在擦除字符后未調整索引,則在循環遞增時將跳過字符。 您必須調整j使其指向正確的索引。 因此j--;

編輯:更好的循環

您可以以不必檢查i==j的方式重新安排循環。 剛開始時,內部循環索引僅比外部循環索引大1。

for(int i=0;i<masiv.size();i++)
{
    for(int j=i+1;j<masiv.size();j++)
    {
        if(masiv[i]==masiv[j])
        {
            masiv.erase(j--, 1);
        }
    }
}

假設您已輸入level作為字符串。 外循環從l開始,內循環從e開始。 通過這種方式,您可以減少迭代次數,並保證不比較相同的索引。

#include <iostream>
#include <string>
#include <algorithm>    // std::unique, std::distance
#include <cassert>

int main(int argc, char** argv) 
{
    std::string masiv;
    int n; 
    std::cin >> n;
    assert( n > 0);
    std::cin.ignore(10,'\n');   // ignore 

    std::getline(std::cin,masiv);
    masiv.resize(n);

    std::string::iterator it = std::unique (masiv.begin(), masiv.end());
    masiv.resize( std::distance(masiv.begin(),it) );

    std::cout << masiv << std::endl;

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM