[英]“String Iterators Incompatible” error message when running bubble sort program
[英]Error in program for modified bubble sort
Codeforces問題339A- http://codeforces.com/problemset/problem/339/A
我試圖對存儲在數組偶數位置(從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;
}
您的編譯器應該已經就該問題警告過您(您確實打開了所有警告,是嗎? 總是這樣做!):一旦i==strlen(s)-1
,通過算術規則的魔術, j
的循環就基本上不受限制了用於有符號/無符號值。
for(unsigned j=0; j+2+i < strlen(s); j+=2)
沒有這個問題。 ( i
應該沒有unsigned
。)
或停止循環為i
早。 那時,您的代碼中的問題仍然存在,但是您不會遇到它。 但我認為這是最差的方法-修復錯誤, 然后觀察i
進行優化,因為最后一個字符已經形成排序序列,因此i
不需要走得更遠。
更改此:
for(i=0;i<strlen(s);i+=2)
變成這個:
for(i=0;i<strlen(s) - 2;i+=2)
否則, s
值將超出其端點
對於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)
這是我的代碼
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.