#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中的字母进行排序。
我得到的输出是完全错误的。
答案 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 < 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];
}
}