- 运营商对char*做了什么?

Jac*_*ack 0 c string

我是C的新手.我正在为C读取一个替换算法,我对这段代码中的-&+运算符有点困惑:

char *replace(char * src, const char * search, const char * replace) {
   char * buffer = malloc(4096);  //allocate 4096 bytes in memory to new string
   char * p; //substring of my search in the src string
   int i;

   p = strstr(src, search);
   if ( NULL == p ) return src; if // 'search' not found on 'src' return src
      i =  p - src; //index of my substring

   strncpy(buffer, src, i); //copy the substring value to buffer
   sprintf(buffer + i, "%s%s", replace, 
   p + strlen(search)); // ???

   return buffer;
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 5

既然p是你的角色数组(字符串)中的一个位置src,它是它的开头,

i = p - src;
Run Code Online (Sandbox Code Playgroud)

将设置ip点的索引.

例如,请考虑以下内存布局:

 [0] [1] [2] [3] [4] [5] [6] [7] [8]  [9]  <-- Indexes
 123 124 125 126 127 128 129 130 131  132  <-- Addresses
+---+---+---+---+---+---+---+---+---+----+
| H | i | , |   | w | o | r | l | d | \0 |
+---+---+---+---+---+---+---+---+---+----+
  ^               ^
  |               |
 src              p
Run Code Online (Sandbox Code Playgroud)

在这种情况下,p - src会给你127 - 123或者4,这也是该指数w"Hi, world".

这称为指针算法,Additive operators在ISO标准(C99 6.5.6/9)中有所涉及:

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

它提供了一种缩放方法,可以在同一个数组中计算差异,或者指向一个指向数组末尾的差异(其他所有内容都是未定义的).

我的意思是做指针运算与(例如)四字节整数,会给你的区别一个的地址之间arr[7]arr[8]没有四成或许有人认为,.

buffer + i构造只是另一种说法&(buffer[i]),i即数组元素的地址buffer.我实际上更喜欢后一种方法,因为它似乎在我试图表达的内容中更明确.

对于它的价值,这实际上并不是一个非常好的字符串替换代码.它有很多问题:

  • 如果没有进行替换,则会发生4K内存泄漏buffer.
  • 无论如何,你应该经常检查以确保malloc没有失败.
  • 你有缓冲区溢出的可能性,新的字符串分配,应该基于的长度真正分配的方式src searchreplace.
  • 您可以使用单个sprintf ("%*.*s%s%s", i, i, src, replace, &(src[i + strlen (search)]));strcpy两个strcat操作创建新字符串.混合两者似乎对我来说不协调.