【问题标题】:Can't understand the usage of strchr to get the position of a charcter in a string in C无法理解 strchr 在 C 中获取字符串中字符位置的用法
【发布时间】:2021-01-30 19:16:46
【问题描述】:

此代码将输出字符串中字符的索引:

#include <stdio.h>
#include <string.h>

int main(void){

   char str[100]="birds are dying";
   char *p;

   p = strchr(str,'e'); 
   int i=p-str;

   printf("%d" , i);

   return 0;
}

我无法理解的唯一代码行是:

int i=p-str;
  1. str 是字符串,p 也是,我搜索了将字符串打印为整数的结果,发现这是一个未定义的行为,那么它实际上返回了什么?

  2. p - str 是:e dying - birds are dying,当我们以某种方式将其更改为整数时,为什么它返回正值

谢谢

【问题讨论】:

  • "string" 是 C 中的一个加载术语:在不同的上下文中可能意味着不同的东西。在您的代码中,str 是一个 16 个字符的数组(在许多情况下[例如基本算术],使用其标识符将其转换为指向其第一个元素的指针),p 是指向 char 的指针。减去两个指针(指向 sme 对象内的某处)产生基础类型元素数量的距离(在您的情况下以字符为单位的距离)。
  • 可以看到表达式的类型是int。那么,为什么您认为您“将字符串打印为整数”?您将 int 打印为整数。
  • 搜索词:指针算法
  • 更具体地说:您的“字符串 - 字符串”实际上是“指针 - 数组”,它被转换为“指针 - 指针”。减法的结果类型为ptrdiff_t,并通过赋值转换为int
  • @pmg Braino/typo: ptr_diff => ptrdiff_t.

标签: c c-strings pointer-arithmetic string.h strchr


【解决方案1】:

它不是一个字符串——它是一个指针。这是合法的指针算术。它以指针为单位工作。假设你有

double x[10], *start, *end;
integer exclusive;

start = &x[2];
end = &x[4];
exclusive = end - start;
printf("%d\n", exclusive);

你认为会打印什么?你会得到 2: not 2 * sizeof(double)。

【讨论】:

  • 对于OP原来的p-str,还值得一提的是str是从数组转换为指针,相当于p-&amp;str[0]
  • 但为什么会发生这种情况或如何发生,是因为 2 个指针返回它们的内存位置,例如 10012 - 10010
  • "因为 2 个指针返回它们的内存位置,例如 10012 - 10010" 是的,这是一种简化的查看方式
  • 感谢pmg的帮助,您可以将其发布为答案
  • 也是在字符串中查找字符位置的最佳方法吗?
【解决方案2】:

来自 C 标准(6.3.2.1 左值、数组和函数指示符)

3 除非它是 sizeof 运算符的操作数或一元 & 运算符,或者是用于初始化数组的字符串文字, 具有“类型数组”类型的表达式被转换为 类型为“类型指针”的表达式,指向初始 数组对象的元素并且不是左值。如果数组对象 有注册存储类,行为未定义

在本次通话中

p = strchr(str,'e');

函数strchr返回一个指向符号'e'.的指针

在表达式中

p-str

具有数组类型char[100] 的对象str 被隐式​​转换为指向其第一个元素的指针。所以表达式代表了两个指针的差。

并且根据 C 标准(6.5.6 加法运算符)

9 当两个指针相减时,两个指针都应指向 相同的数组对象,或数组的最后一个元素 目的;结果是两者下标的差 数组元素....

因此,差异是两个指针之间的元素数,它产生找到的符号的索引,因为表达式str(在数组str 隐式转换为指针之后)指向数组的第一个元素。

【讨论】:

    猜你喜欢
    • 2016-03-29
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2017-07-23
    • 1970-01-01
    相关资源
    最近更新 更多