在http://www.cplusplus.com/reference/cstring/strchr/的strchr
引用中,提供了此示例。
/* strchr example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "This is a sample string";
char * pch;
printf ("Looking for the 's' character in \"%s\"...\n",str);
pch=strchr(str,'s');
while (pch!=NULL)
{
printf ("found at %d\n",pch-str+1);
pch=strchr(pch+1,'s');
}
return 0;
}
为什么从char
指针str
中减去char
数组pch
加上一个int
? (由%d
格式类型表示)如果我删除&#34; -str
&#34;,程序将不会执行,直到我将%d
更改为{{1 }}
答案 0 :(得分:4)
缺点是, bug :
该表达式可能属于int
类型,或者您在调用printf
时可能有未定义行为。
让我们一步一步地采取行动:
您实际上并没有从指针中减去数组,而是从指针中减去指针:
在几乎所有情况下,array decays to a pointer to its first element。
两个指针的区别是什么类型(仅当它们指向或直接位于同一个数组的元素后面时才定义)?
ptrdiff_t
(这是typedef
中<stddef.h>
的用途。)
ptrdiff_t
可能恰好是int
,但不要依赖它。
相反,请使用正确的格式说明符:%ti
。
答案 1 :(得分:0)
数组名称衰减为指针(在大多数情况下)到其第一个元素。减去两个指针会产生ptrdiff_t
类型的数据,前提是指向同一数组的元素。
答案 2 :(得分:-2)
您正在研究C / C ++和指针的一个奇怪之处。指针和数组语法和语义简直就是坚果。
str是指向char(以及数组)的指针。 pch也是指向char的指针。
如果你减去两个指向同一类型的指针,你会得到它们之间的元素数量。
你甚至可以做
3 [str] ;
相当于
str[3] ;
并且相当于
*(str+3) ;
你的表达:
pch - 1
具有指向char的类型指针。你的表达
pch - str
的类型为int。