作者jacky1989 ()
看板C_and_CPP
標題[問題] 求B字串在A字串中的位置
時間Fri Dec 9 01:04:19 2016
開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1481216662.A.C1A.html
1F:→ hylkevin: 32bit系統若str_A位址大於0x80000000, 強制轉成整數會溢 12/09 01:40
2F:→ hylkevin: 位變負。 12/09 01:40
所以負數減掉一個非常大的負數,才會變成正數這樣嗎?
那如果要實現我的功能,我應該怎麼改才好?
※ 編輯: jacky1989 (111.249.105.253), 12/09/2016 01:48:02
3F:→ CoNsTaR: char* pos = strstr(...); 12/09 02:08
4F:→ CoNsTaR: if (pos == NULL) 12/09 02:08
5F:→ CoNsTaR: return -1; 12/09 02:08
6F:→ CoNsTaR: else 12/09 02:08
7F:→ CoNsTaR: return (ptrdiff_t)(pos - str_A); 12/09 02:08
8F:推 LPH66: 這問題其實是你預設了空指標減去一個指向物件的指標會為負 12/09 02:25
9F:→ LPH66: 但標準裡規定非屬同陣列的指標相減其結果未定義 12/09 02:26
10F:→ LPH66: (即是版標講的未定義行為) 空指標顯然不會指向哪個陣列 12/09 02:29
11F:→ LPH66: 因此無法預期相減會發生什麼事 12/09 02:29
12F:→ EdisonX: int iret = ( pos=strstr(...) ? (pos-str_A) : -1 ) ; 12/10 23:07
13F:推 LPH66: pos=strstr(...) 要括號起來... 12/11 00:14
14F:→ EdisonX: 對 @@ 少一個括號 , 謝謝指正。 12/11 00:32