我是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)
既然p是你的角色数组(字符串)中的一个位置src,它是它的开头,
i = p - src;
Run Code Online (Sandbox Code Playgroud)
将设置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
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.我实际上更喜欢后一种方法,因为它似乎在我试图表达的内容中更明确.
对于它的价值,这实际上并不是一个非常好的字符串替换代码.它有很多问题:
buffer.malloc没有失败.src search和replace.sprintf ("%*.*s%s%s", i, i, src, replace, &(src[i + strlen (search)]));或strcpy两个strcat操作创建新字符串.混合两者似乎对我来说不协调.| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |