【问题标题】:C Pointer SubtractionC 指针减法
【发布时间】:2018-04-10 15:19:02
【问题描述】:

我遇到了指针相减的问题。

char a[] = "abcdefghijkl";
a2 = 'g';
a3 = "jkl";
*a4, *a5;

a4 = strchr(a,a2);
a5 = strstr(a,a3);

printf("%s\n", a+6);
printf("%c\n", *a);
printf("%c\n", *(++a4));
printf("%c\n", ++(*a4));
printf("%ld\n", a5-a4);
printf("%s\n", &a[2]);
  1. printf 函数打印:ghijkl
  2. printf 函数打印:a
  3. printf 函数打印:h
  4. printf 函数打印:i
  5. printf 函数打印:2
  6. printf 函数打印:cdefgiijkl

5。和 6. 对我来说有问题。 a4 的最后一种形式指向“i”,a5 指向“j”。在这种情况下,我认为我应该取 1 作为 a5-a4 的结果。 最后一个对我来说也很复杂。我只需要它是“c”。

【问题讨论】:

  • 请添加一个 MCVE stackoverflow.com/help/mcve
  • @CIsForCookies 为使其成为完整的 MCVE 而给出的代码中唯一缺少的是main()
  • a2和a3有哪些数据类型?
  • 您是否在调试器中单步执行过这段代码?甚至以十六进制打印值? printf 会将指针视为指向以 %s 结尾的以 null 结尾的字符,为什么它会停在 'c' 处?
  • a5 = strchr(a,a3);,这里a3 是字符串,strchr() 需要一个 int 作为第二个参数。你没有收到警告吗?

标签: c pointers syntax


【解决方案1】:

++(*a4) 改变a4 指向的字符。它不会改变a4a4 仍然指向a5 之前的两个字符。

【讨论】:

    【解决方案2】:

    这段代码: printf("%s\n", &a[2]);

    将打印直到遇到一个空终止符,它在 a[] 的末尾,因为它被初始化。它不会在 a[2] 处的字符之后停止。您需要一个不同的格式说明符,或者您需要在“2”之后插入一个空终止符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-28
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多