作者yongb (藍海悅)
看板C_and_CPP
標題[問題] C++ string 奇怪錯誤
時間Wed Dec 2 00:31:16 2015
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
ubuntu g++4.8.4
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
剛在刷UVA 10929 程式碼看了很久都不知道錯在哪
餵入的資料(Input):
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
UVA10929.cpp: In function ‘int main()’:
UVA10929.cpp:14:24: warning: comparison between signed and unsigned integer
expressions [-Wsign-compare]
for(int i=0;i<s.size();i++)
^
程式碼(Code):(請善用置底文網頁, 記得排版)
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
while(cin>>s && s!="0")
{
long long int sum[2]={0,0};
/*cout<<s.size()<<endl;
這行是我再出錯的時候註解掉以下程式碼測試用的
意外的是這樣子編譯就可以通過 */
for(int i=0;i<s.size();i++)
sum[i%2]+=s[i]-'0';
cout<<s<<"is"<<((sum[0]-sum[1])%11?"not":" ");
cout <<"a multiple of 11." << endl;
}
return 0;
}
補充說明(Supplement):
編譯錯誤,但我丟UVA居然AC了....冏 UVA G++ 版本是4.8.2
我編譯所用的指令是
$ g++ -g -Wall UVA10929.cpp -o UVA10929
是編譯器的問題嗎
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.165.149.139
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1448987479.A.A4A.html
※ 編輯: yongb (1.165.149.139), 12/02/2015 00:32:02
※ 編輯: yongb (1.165.149.139), 12/02/2015 00:32:46
推 LPH66: (1) 它給警告, 所以編譯依然能過且可以執行, 但結果不一定 12/02 00:42
→ LPH66: 是你想要的 12/02 00:42
→ LPH66: (2) 這警告在講你把一個有號數跟無號數做比較了 12/02 00:42
→ LPH66: 問題在於有號跟無號數對某些位元組合的比較規則不同 12/02 00:43
→ LPH66: 準確來說是那些有號數為負數的組合, 有號數要當負的看 12/02 00:43
→ LPH66: 但無號數要當正的看, 所以編譯器搞不懂你要怎麼比 12/02 00:44
→ LPH66: (3) 但編譯器還是會猜一個用, 我不太肯定細節但應該是把 12/02 00:45
→ LPH66: 有號升級成無號來比, 這裡對那些組合就有一些微妙之處 12/02 00:45
→ LPH66: (4) 所以這裡正確用法是把 i 改宣告為無號型態 12/02 00:45
→ LPH66: 最正確的用法是 size_t, 不過 unsigned int 也是可以 12/02 00:46
→ LPH66: size_t 是標準規定用來表示東西大小的值, 是無號型態 12/02 00:47
原來如此阿,感謝大大,真的解釋非常清楚,真的學到了
馬上就來實際測試看看
→ Caesar08: 這排版... 有點神奇 12/02 00:59
大大是說程式碼嗎?抱歉,傷了你們的眼睛xD
→ TobyH4cker: 所以說囉... 12/02 08:05
※ 編輯: yongb (114.46.91.60), 12/02/2015 13:27:06