【问题标题】:Why garbage value showing up?为什么会出现垃圾值?
【发布时间】:2020-12-17 01:08:50
【问题描述】:

用户输入类似“3+2+1”或“1+3+2+1+3+1”的字符串。我只需要对字符串进行排序。但是在出现 4-5 个测试用例后出现错误。

Input  - 2
Output - �

Input  - 2+1+2+2+2+3+1+3+1+2
Output - �+1+1+1+2+2+2+2+2+3
#include<iostream>
using namespace std;

int main()
{

    string s;
    cin>>s;

    for(int i=0;i<s.size();i+=2)
    {
        for(int j=0;j<(s.size()-i);j+=2)
        {
            if(s[j]>s[j+2])
            {
                swap(s[j],s[j+2]);
            }
        }
    }

    cout<<s;
    return 0;
}

【问题讨论】:

  • 欢迎来到 SO!您的内部循环运行到size,并且在此循环内您访问超出范围的size-1+2。你想在这里完成什么?如果要按字母顺序对字符串进行排序,请使用std::sort
  • 这里有个提示,不要使用s[j],而是使用s.at(j)。不同的是,如果j 对于sat 来说太大了,你会抛出异常,所以你会知道有问题。使用s[j],如果j 太大,结果是不可预测的。
  • 或者打开标准库的调试模式,这可能会在索引调用时给你一个硬错误。或者使用地址清理程序进行编译,以捕获可能漏掉的内存错误。
  • 您似乎正在研究冒泡排序实现,但始终得到增加(通常为i++i+=1 或ì=i+1`)错误并且增加太多,即增加2 . 你能解释一下你的代码非常奇怪的地方吗?没有这个问题就不清楚了。
  • @Yunnosch 我认为+2 是因为OP只想对表达式的数字进行排序(因此他们忽略了多位数字的可能性)。

标签: c++ sorting garbage


【解决方案1】:

正如 ggorlen 所说,出现垃圾是因为您正在访问一个超出范围的值。在进行任何交换之前,请尝试检查您的“j”索引加 2 是否超出范围。

#include<iostream>
using namespace std;

int main()
{

    string s;
    cin>>s;

    for(int i=0;i<s.size();i+=2)
    {
        for(int j=0;j<(s.size()-i);j+=2)
        {
            if(j+2 < s.size() && s[j]>s[j+2])
            {
                swap(s[j],s[j+2]);
            }
        }
    }

    cout<<s;
    return 0;
}

输入2+1+2+2+2+3+1+3+1+2

输出1+1+1+2+2+2+2+2+3+3

【讨论】:

    【解决方案2】:

    j 的值超出范围。尝试使用插入排序:

    #include <bits/stdc++.h>
    using namespace std;
    
    void insertionSort(string s)
    {
        int key, j; 
        for (int i = 1; i < s.size(); i++) 
        { 
            key = s[i]; 
            j = i - 1; 
            while (j >= 0 && s[j] > key) 
            { 
                s[j + 1] = s[j]; 
                j = j - 1; 
            } 
            s[j + 1] = key; 
        } 
        for (int i = 0; i < s.size(); i++) 
            cout << s[i] << " "; 
        cout << endl; 
    }
    
    int main() 
    { 
        string s;
        cin>>s;
        insertionSort(s); 
    
        return 0; 
    }
    

    希望你理解代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-06
      • 2021-11-02
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 2018-02-18
      • 2021-02-20
      • 2021-04-07
      相关资源
      最近更新 更多