C++ 修改气泡排序的程序出错
代码部队问题339A- 我已尝试对存储在数组偶数位置的值进行排序(从0开始)。运行程序时出错,或程序返回垃圾值。我的解决方案有什么问题 我的解决方案:C++ 修改气泡排序的程序出错,c++,string,sorting,C++,String,Sorting,代码部队问题339A- 我已尝试对存储在数组偶数位置的值进行排序(从0开始)。运行程序时出错,或程序返回垃圾值。我的解决方案有什么问题 我的解决方案: #include<iostream> #include<cstring> using namespace std; int main() { char s[101],temp; int i,j; cin>>s; for(i=0;i<strlen(s);i+=2) /
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char s[101],temp;
int i,j;
cin>>s;
for(i=0;i<strlen(s);i+=2) //Bubble sorting values at even values of i.'+' is stored at odd values of i.
{
for(j=0;j<(strlen(s)-i-2);j+=2)
{
if(s[j]>s[j+2])
{
temp=s[j];
s[j]=s[j+2];
s[j+2]=temp;
}
}
}
cout<<s;
}
#包括
#包括
使用名称空间std;
int main()
{
字符s[101],温度;
int i,j;
cin>>s;
对于(i=0;i改变:
for(i=0;i<strlen(s);i+=2)
用于(i=0;i对于s
的奇数长度len
,外循环一直运行到i==len-1
。然后,内循环终止于len-len-1-2
。由于strlen
返回一个无符号类型,因此计算结果为一个非常大的无符号数,导致内循环的读取距离s
的末尾很远最终,您将访问无法读取或写入的内存,从而导致崩溃
您可以通过更快地结束外部循环来解决此问题
int len = strlen(s);
for(i=0;i<len-2;i+=2) {
for(j=0;j<(len-i-2);j+=2)
int len=strlen;
对于(i=0;i你的编译器应该警告你这个问题(你确实打开了所有警告,是吗?总是这样做!):一旦i==strlen(s)-1
,j
的循环本质上是无界的,这得益于有符号/无符号值的算术规则的魔力
for(unsigned j=0; j+2+i < strlen(s); j+=2)
for(无符号j=0;j+2+i
没有此问题。(i
也应该是unsigned
)
或者更早地停止i
的循环。代码中的问题仍然存在,但您不会遇到。但我认为这是更糟糕的方法-修复错误,然后通过观察i
进行优化,因为最后一个字符已经形成了排序序列。这是我的代码>
void bubble(int a[], int n){
for(int i=0; i<n; i++){
int swaps=0;
for(int j=0; j<n-i-1; j++){
if(a[j]>a[j+1]){
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
swaps++;
}
}
if(swaps==0)
break;
}
}
void气泡(int a[],int n){
对于(int i=0;i验证数组边界,并考虑使用<代码> STD::String < /Cord>)。您回答的问题完全错了,+是一个定界符,这并不意味着数字只有一个数字,更不用说输入是代码> 1 + 1 + 3 + 1 + 3 < /代码>(例子),而您的代码对it@nrathaus数字只有1,2,3,所以它们是一位数字,没有空格。这种方法似乎很合理。@nrathaus-这些数字都在集合{1,2,3}中因此,这种方法是有效和明智的。对于这个问题,它可能听起来不错,但我不认为它是在教你以正确的方式做事为什么这很重要?下一行-cin>>s;
-将s
初始化为nul终止符吗?@simonc,对不起,我认为异常的原因是错误的,请参阅@simonc的解释,基本上是因为len到达strlen(s)-1之前,内部循环没有到达strlen(s)-(strlen(s)-1)-2,这意味着-1-2=>-3,这是越界的,不是吗?不,因为他跳过了“2”,你没有抓住要点:len
没有签名,所以len-(len-1)-2
将是一个较大的正值。如果它是-3
,则不会出现问题,循环将立即终止。请尝试它:for(j=0;jp请提供有关它的作用以及如何回答问题的更多详细信息
void bubble(int a[], int n){
for(int i=0; i<n; i++){
int swaps=0;
for(int j=0; j<n-i-1; j++){
if(a[j]>a[j+1]){
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
swaps++;
}
}
if(swaps==0)
break;
}
}