作者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/cn.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