[問題] 求B字串在A字串中的位置

作者: jacky1989   2016-12-09 01:04:19
開發平台(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卻不會
我是哪邊寫錯或是哪邊需要修改,才能符合我所預期的功能呢?
再麻煩高手幫忙一下,感謝
作者: hylkevin (19s)   2016-12-09 01:40:00
32bit系統若str_A位址大於0x80000000, 強制轉成整數會溢位變負。
作者: CoNsTaR ((const *))   2016-12-09 02:08:00
char* pos = strstr(...);if (pos == NULL)return -1;elsereturn (ptrdiff_t)(pos - str_A);
作者: LPH66 (-6.2598534e+18f)   2016-12-09 02:25:00
這問題其實是你預設了空指標減去一個指向物件的指標會為負但標準裡規定非屬同陣列的指標相減其結果未定義(即是版標講的未定義行為) 空指標顯然不會指向哪個陣列因此無法預期相減會發生什麼事
作者: EdisonX (卡卡獸)   2016-12-10 23:07:00
int iret = ( pos=strstr(...) ? (pos-str_A) : -1 ) ;
作者: LPH66 (-6.2598534e+18f)   2016-12-11 00:14:00
pos=strstr(...) 要括號起來...
作者: EdisonX (卡卡獸)   2016-12-11 00:32:00
對 @@ 少一個括號 , 謝謝指正。

Links booklink

Contact Us: admin [ a t ] ucptt.com