Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 修改气泡排序的程序出错_C++_String_Sorting - Fatal编程技术网

C++ 修改气泡排序的程序出错

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) /

代码部队问题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) //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;
    }
}