[问题] 求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