看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) Linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 問題(Question): 我有一個B字串跟一個A字串 那我想知道,B字串在A字串中的位置(不管B有沒有出現在A) 所以我使用strstr來處理 int location; char str_A[20]="Hello world.",str_B[6]="Error"; location=(int)(strstr(str_A,str_B)-str_A); if(location<0) return -1; else return location; 如果找不到,應該相減後會為負數 但是在Linux下偶爾相減後卻是一個非常大的正數 導致程式判斷就錯誤了,但是Windows卻不會 我是哪邊寫錯或是哪邊需要修改,才能符合我所預期的功能呢? 再麻煩高手幫忙一下,感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.249.105.253 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1481216662.A.C1A.html
hylkevin: 32bit系統若str_A位址大於0x80000000, 強制轉成整數會溢 12/09 01:40
hylkevin: 位變負。 12/09 01:40
所以負數減掉一個非常大的負數,才會變成正數這樣嗎? 那如果要實現我的功能,我應該怎麼改才好? ※ 編輯: jacky1989 (111.249.105.253), 12/09/2016 01:48:02
CoNsTaR: char* pos = strstr(...); 12/09 02:08
CoNsTaR: if (pos == NULL) 12/09 02:08
CoNsTaR: return -1; 12/09 02:08
CoNsTaR: else 12/09 02:08
CoNsTaR: return (ptrdiff_t)(pos - str_A); 12/09 02:08
LPH66: 這問題其實是你預設了空指標減去一個指向物件的指標會為負 12/09 02:25
LPH66: 但標準裡規定非屬同陣列的指標相減其結果未定義 12/09 02:26
LPH66: (即是版標講的未定義行為) 空指標顯然不會指向哪個陣列 12/09 02:29
LPH66: 因此無法預期相減會發生什麼事 12/09 02:29
EdisonX: int iret = ( pos=strstr(...) ? (pos-str_A) : -1 ) ; 12/10 23:07
LPH66: pos=strstr(...) 要括號起來... 12/11 00:14
EdisonX: 對 @@ 少一個括號 , 謝謝指正。 12/11 00:32