【发布时间】:2012-08-30 19:16:39
【问题描述】:
我遇到过这样的功能,对于我反转特殊类型单词的任务非常有用。
我在 while 循环中遇到了复杂的指针算法问题。如何显示留在后面的数组索引号,例如。 word,dPtr 或 subword(在当前迭代中)与 printf ?
我只实现了减法值(subword-word)和(dPtr-dest)。
有没有办法创建一个“零”的“foo”指针,这样减法就可以单独给出检查值?
代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
char* subword = NULL;
char* dest;
char* dPtr;
size_t n, len;
int len_int, n_int;
char word[] = "-example-compound-word";
len = strlen(word);
len_int = (int)len;
printf("string length is %d\n", len_int);
dest = malloc(len+1);
if (dest == NULL) return -1;
dPtr = dest;
while((subword = strrchr(word, '-'))!= NULL) {
printf("the pointer values are: subword-word %ld, dPtr-dest %ld\n", (subword-word), (dPtr-dest));
n = len - (subword-word) - (dPtr-dest);
n_int = (int)n;
printf("and the n is %d\n", n_int);
if (n-1 > 0)
strncpy(dPtr, subword+1, n-1);
*subword = '\0';
dPtr += n-1;
*dPtr = '-';
dPtr++;
}
strncpy(dPtr, word, len - (dPtr-dest));
dest[len] = '\0';
printf("the output is %s\n", dest);
return 0;
}
提前致谢!
【问题讨论】:
-
您的问题是如何打印指针?
printf("%p\n", (void*)ptr);做到了。 -
@DanielFischer 我知道,但它只以十六进制格式打印其地址。我想获得整数值作为当前处理的数组索引。如果只能使用我在上面代码中提出的方法来实现,那么如何为这种减法制作一个“foo”指针以获得处理后索引的绝对值?
-
subword - word给出数组元素subword指向的索引(作为ptrdiff_t)。一般来说some_type arr[100]; some_type *ptr = &arr[12];,ptr - arr给出元素ptr指向(这里是12)的索引。 “已处理索引的绝对值”是什么意思?您可以通过减去基指针来获得索引,在您的情况下为wordresp。dest,就像你一样。对不起,我不太明白你在问什么。 -
你想打印复合词中的子词吗?如“示例”、“复合”、“单词”?
-
@Peter 只是为了明确说明为什么 Daniel 的答案是正确的,指针算术与整数算术不同,因为加数隐式地乘以您正在操作的类型的大小。这就是为什么它有效。尝试在 void * 上进行指针运算,您会发现它无法编译。
标签: c pointers pointer-arithmetic