1

私はそのような関数に出くわしました。これは、特別な種類の単語を逆にするという私のタスクに非常に役立ちます。while ループでの複雑なポインター演算に問題があります。遅れている配列インデックス番号を表示する方法。worddPtrまたは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;
}

前もって感謝します!

4

1 に答える 1

2

p配列 (または配列として機能するed メモリ ブロック) へのポインターがある場合malloc、 から最初の要素へのポインターを減算することにより、ポイント先の配列要素のインデックスを取得しますp

の場合、配列名はほとんどのコンテキストで ( の引数としてではなく) 最初の要素へのポインターに変換されるため、subword単純に を使用できます。wordsizeof

subword - word

配列wordはその最初の要素へのポインターに変換され、a を明示的に使用した同等の形式char*

subword - &word[0]

の場合、dPtr減算されるベース ポインタはであり、これはed メモリ ブロックdestの最初のバイトを指し、malloc

dPtr - dest

対応するインデックスを与える. の場合char*、インデックスはバイト単位のオフセットと同じですが、一般に、同じ配列を指している同じオブジェクト型への 2 つのポインター (または末尾の 1 つ後) を減算すると、それらの間の要素の数も得られます。バイトオフセットではなく、2 つのポインター。

2 つのポインタを減算した結果は 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 に答える