1

在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数组加一会得到一个?(由格式类型表示)如果我删除“ ”,程序将不会执行,直到我更改为.strcharpchint%d-str%d%s

4

3 回答 3

4

简而言之,这是一个错误
该表达式可能是 type int或者您可能在调用.printf

让我们一步一步来:

  1. 您实际上不是从指针中减去数组,而是从指针中减去指针:
    在几乎所有上下文中,数组都会衰减为指向其第一个元素的指针

  2. 两个指针的区别是什么类型(仅当它们指向或直接指向同一数组中的元素时才定义)?

    ptrdiff_t(这就是typedefin<stddef.h>的用途。)

  3. ptrdiff_t可能碰巧是int,但不要依赖它。
    相反,请使用正确的格式说明符:%ti.

于 2015-01-03T16:37:08.063 回答
0

数组名称衰减为指向其第一个元素的指针(在大多数情况下)。两个指针相减产生一个ptrdiff_t类型的数据,前提是两个指针都指向同一个数组的元素。

于 2015-01-03T16:34:25.520 回答
-2

您正在查看 C/C++ 和指针的奇怪之处之一。指针和数组的语法和语义简直是疯了。

str 是指向 char(以及数组)的指针。pch 也是一个指向 char 的指针。

如果你减去两个指向相同类型的指针,你会得到它们之间的元素数。

你甚至可以做

    3 [str] ;

这相当于

   str[3] ;

并且等价于

   *(str+3) ;

你的表情:

  pch - 1

具有指向 char 的类型指针。你的表情

  pch - str

具有 int 类型。

于 2015-01-04T05:39:39.317 回答