使用冒泡排序/交换在c ++中对字符串进行排序

时间:2013-12-06 21:28:46

标签: c++ sorting swap

我是C ++的新手,我似乎无法解决这个问题。这个代码只是让用户输入一个动物列表(不超过25只动物,30个字母长),然后它将按照输入的顺序输出它们,然后按字母顺序输出(使用冒泡排序)。如果我的代码难以理解或理解,我会道歉。

每当我放入诸如“dog”,“cat”,“fish”等动物并以句点终止列表时,我通常会在CharacterStrings.exe中的0x55b6d2f3处获得“未处理的异常:0xC0000005:访问冲突读取位置0xcccccccc”。 “但其他时候我得到“在CharacterStringsList.exe中发生了缓冲区溢出,这已经破坏了程序的内部状态。”

我对如何解决这个问题感到非常困惑。我尝试了谷歌这两个,但我似乎找不到任何适合我的解决方案(因为我还是初学者,不知道如何做更多高级代码)。我很确定错误是在我的交换功能中的某个地方(也许?)但是我无法想象它。也许是逻辑错误?我已经尝试了我能想到的一切。

如果您有任何疑问,请与我联系。任何帮助或建议将不胜感激!提前谢谢你:)

#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;

void getInput(char animals[][30]);
void outputLists(char animals[][30]);
void bubbleSort(char animals[][30], int n);
void Swap(char *a, char *b);


void getInput(char animals[][30])
{
    cout << "Please enter a list of animals, terminated by a period: " << endl;

    for(int i = 0; i < 25; i++)
    {
        cin >> animals[i];
        if(strcmp(animals[i], ".") == 0)
            break;
    }
}

void bubbleSort(char animals[][30], int size)
{
    for(int i = 0; i < size-1; i++)
        for(int j = 0; j < size-1; j++)
            if(animals[j] < animals[j+1])
                Swap(animals[j], animals[j+1]);
}

void Swap(char *a, char *b)
{
    char t[30];
    strcpy(t, a);
    strcpy(a, b);
    strcpy(b, t);
}

void outputLists(char animals[][30])
{
    //Output original list
    for(int i = 0; i < 25; i++)
    {
        if(strcmp(animals[i], ".") == 0)
            break;
        cout << animals[i] << endl;
    }

    //Output sorted list
    for(int i = 0; i < 25; i++)
        cout << animals[i] << endl;

}

int main()
{
    char animals[25][30];

    getInput(animals);

    cout << endl;
    bubbleSort(animals,25);

    outputLists(animals);


    cout << endl;
    system("pause");
    return 0;
}

1 个答案:

答案 0 :(得分:1)

使用strcmp(s1, s2)比较C风格的字符串。如果s1小于s2,则返回小于零的值。

还有一个提示:C风格的字符串是以空字符结尾的字符串(即字符串本身后面有一个零值),所以你需要一个大小至少为n + 1的数组来存储长度为n的字符串。在你的情况下,30是不够的,但31是。