c - - 运算符对 char * 有何作用?

标签 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;
}

最佳答案

p是字符数组(字符串)中的一个位置,src是它的开始,

i = p - src;

将设置i p 所在的索引点数。

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

 [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

在这种情况下,p - src会给你127 - 1234 , 这是 w 的索引在 "Hi, world" 内.

这称为指针算法,涵盖在 Additive operators 中。在 ISO 标准 ( C99 6.5.6/9 ) 中:

When two pointers are subtracted, both shall point to elements of the same array object, or one past the last element of the array object; the result is the difference of the subscripts of the two array elements.

它提供了一种按比例计算差异的方法在同一个数组内或一个指向刚好超出数组末尾的地方(所有其他未定义)。

我的意思是用(例如)四字节整数做指针运算,会给你一个一个的地址之间的差异arr[7]arr[8] ,而不是某些人认为的四个。

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

就其值(value)而言,这实际上并不是一个很好的字符串替换代码。它有很多问题:

  • 如果没有进行替换,则 buffer 有 4K 内存泄漏.
  • 在任何情况下,您都应该始终检查以确保malloc没有失败。
  • 新字符串的分配方式可能会导致缓冲区溢出,您应该真正根据src的长度进行分配。 searchreplace .
  • 你可以用一个 sprintf ("%*.*s%s%s", i, i, src, replace, &(src[i + strlen (search)])); 来创建新的字符串或 strcpy和两个 strcat操作。将两者混在一起对我来说似乎不协调。

关于c - - 运算符对 char * 有何作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9660465/

相关文章:

将 char * 转换为 4 个字符串

C - 打印特定的 Trie 段

c - 我应该包括手册页概要中列出的任何或所有标题吗?

swift - 如何从字符串中间删除一个字符? swift 4

c - C 中的指针二叉树迷宫求解器

c - 想检查信用卡号码是否有效

java - java中如何使用for循环和if语句将字符串中的每个字母加倍

c++ - 在函数 C++ 中使用字符串数组

C++ 相当于 .ToString()

python - 字符串比较和排序功能