#12051: RE求救


saintmaple (舜弘郭)

學校 : 國立鳳山高級中學
編號 : 64634
來源 : [140.115.50.48]
最後登入時間 :
2021-03-18 13:33:50
a022. 迴文 | From: [122.117.152.97] | 發表日期 : 2017-05-21 15:06

請各位大神幫幫我TAT

自己測試沒問題

CODE如下:

#include <iostream>
#include <string>
#define endl '\n'
using namespace std;
int main(){
bool a;
string str;
int i;
while(getline(cin,str)){
a=1;
for(i=0;i<=str.length()/2+1;i++){
if(str.at(i)!=str.at(str.length()-1-i)){
a=0;
break;
}
}
if(a==1)cout<<"yes"<<endl;
else cout<<"no"<<endl;
str.clear();
}
}

RE的訊息如下:

第 1 測資點(100%): RE (SIGABRT)
執行時期錯誤

系統呼叫了 abort 函式!
terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::at: __n (which is 2) >= this->size() (which is 2)
Aborted (core dumped)

 

 
#12053: Re:RE求救


saintmaple (舜弘郭)

學校 : 國立鳳山高級中學
編號 : 64634
來源 : [140.115.50.48]
最後登入時間 :
2021-03-18 13:33:50
a022. 迴文 | From: [122.117.152.97] | 發表日期 : 2017-05-21 16:13

請各位大神幫幫我TAT

自己測試沒問題

CODE如下:

#include
#include
#define endl '\n'
using namespace std;
int main(){
bool a;
string str;
int i;
while(getline(cin,str)){
a=1;
for(i=0;i<=str.length()/2+1;i++){
if(str.at(i)!=str.at(str.length()-1-i)){
a=0;
break;
}
}
if(a==1)cout<<"yes"<<endl;
else cout<<"no"<<endl;
str.clear();
}
}

RE的訊息如下:

第 1 測資點(100%): RE (SIGABRT)
執行時期錯誤

系統呼叫了 abort 函式!
terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::at: __n (which is 2) >= this->size() (which is 2)
Aborted (core dumped)

 

剛剛測試發現


if(str.at(i)!=str.at(str.length()-1-i))改成if(str[i]!=str[str.length()-1-i])即可

可是為甚麼阿...

 

 
#12054: Re:RE求救


anandrewboy70900 (ShowTsai)

學校 : 國立中央大學
編號 : 27736
來源 : [203.204.218.144]
最後登入時間 :
2024-10-11 16:21:37
a022. 迴文 | From: [140.115.204.235] | 發表日期 : 2017-05-22 13:39

 

照你迴圈的寫法

如果輸入是2個相同的字元

例如說11, aa之類的(假設是str)

他只有str[0], str[1]

但是你的迴圈會跑到str[2]和str[一個很大的數字]比較

用at會自動檢查邊界

所以才會RE

但是用[]

不會檢查邊界

至於str[2]和str[一個很大的數字]是否相等

可能是要看系統

我也不確定

 




 
ZeroJudge Forum