试图用c ++对一个简单的字符串进行排序

时间:2010-04-25 17:58:45

标签: c++

#include "stdio.h"
#include "conio.h"
#include <iostream>

using namespace std;

int main (void) 
{
    char my_char[] = "happy birthday";

    int i;

    bool j=false;
    char my_char_temp[1];

    do
    {
        for (i=0;i<sizeof(my_char)-2;i++)
        {
            j=false;
            if (my_char[i+1] < my_char[i])
            {
                my_char_temp[0]=my_char[i+1];
                my_char[i+1] = my_char[i];
                my_char[i] =  my_char_temp[0];
                j=true;
            }
        }

    }while (j);

    cout << my_char;
}

我做错了什么?

我只是想对char中的字母进行排序。

我得到的输出是完全错误的。

6 个答案:

答案 0 :(得分:3)

您想使用strlen()而不是sizeof

答案 1 :(得分:2)

我不知道你想用你的sizeof(...) - 2等实现什么,但你可能想要得到的就是这样:

#include <iostream>
#include <algorithm>

int main() {
   std::string s("happy birthday");
   std::sort(s.begin(), s.end());
}

答案 2 :(得分:2)

每次比较两个字符时,您都会将j重置为false。

这意味着,如果您交换两个字符,并且您不在数组末尾,则会忘记已交换它们。

移动j = false;从for循环内部到do循环内部。

在星期天下午,你欠我一瓶杰克,以便把你的屁股留在家庭作业上。

答案 3 :(得分:0)

考虑一下这个循环中发生了什么:

for (i=0;i<sizeof(my_char)-2;i++)

如果您找到要交换的一对值,请将j设置为true,您将继续迭代该循环,并将j设置回false下一次迭代。因此,只要字符串中的最后两个字符按排序顺序,程序就会退出,无论字符串的其余部分是否已排序。

相反,只要找到要交换的一对字符,就要在i=0处重新开始。最简单的方法是在break;行之后添加j = true语句。使用该修复程序,这可以正常工作。

或者,您可以在循环外移动初始j = false行,这将以稍微不同的方式解决问题。

答案 4 :(得分:0)

你其实很亲密。唯一的问题是

        j=false;

需要在外循环中。按原样,每次内循环执行时都会清除j

通过此修复程序,您的程序可以正常使用。

然而,文体错误是另一回事。

答案 5 :(得分:0)

我可能会弄错,但看起来你正试图做bubble sort? 它是我&lt; sizeof(my_char)-2因为他使用的是基于0的空终止字符串,并且他不想对空终止符进行排序。

尝试重复内循环的条件,使用j而不是i,看看是否有效?请注意,它的运行时间为O(n ^ 2),如果需要,您可以更快地进行排序。或者,您可以将布尔值移出for和for循环。

for (i=0;i &lt; sizeof(my_char)-2;i++)
            for (i=0;i<sizeof(my_char)-2;i++)
        {

            if (my_char[i+1] < my_char[i])
            {
                my_char_temp[0]=my_char[i+1];
                my_char[i+1] = my_char[i];
                my_char[i] =  my_char_temp[0];

            }
}