1

我遇到过这样的功能,对于我反转特殊类型单词的任务非常有用。我在 while 循环中遇到了复杂的指针算法问题。如何显示留在后面的数组索引号,例如。worddPtrsubword(在当前迭代中)与 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;
}

提前致谢!

4

1 回答 1

2

如果您有一个指向p数组的指针(或指向malloc充当数组的 ed 内存块),您可以通过从 中减去指向第一个元素的指针来获得指向数组元素的索引p

在 的情况下subword,您可以简单地使用word,因为数组名称在大多数上下文中(不是作为 的参数sizeof)转换为指向其第一个元素的指针,因此在表达式中

subword - word

数组word被转换为指向其第一个元素的指针,并且显式使用 a 的等效形式char*

subword - &word[0]

在 的情况下dPtr,要减去的基指针是dest,它指向malloced 内存块的第一个字节,并且

dPtr - dest

给出相应的索引。在 的情况下char*,索引与以字节为单位的偏移量相同,但一般来说,指向同一数组的相同对象类型的两个指针相减(或末尾的一个)也会产生两个指针,而不是字节偏移量。

请注意,两个指针相减的结果是 type 的值,而用于此类值ptrdiff_t的长度修饰符是,所以printft

printf("the pointer values are: subword-word %ld, dPtr-dest %ld\n", (subword-word), (dPtr-dest));

应该正确

printf("the pointer values are: subword-word %td, dPtr-dest %td\n", (subword-word), (dPtr-dest));

long int或者如果使用了l长度修饰符,则应该将值转换为。

于 2012-08-30T21:22:10.167 回答