0

ポインタ演算を使用して、char配列を別のchar配列にコピーしようとしています。copy()内では正しいようですが、mainに到達した後に何が起こるのかわかりません。関数を呼び出しても、chara[]はcharb[]の値を取得しません。私は何かが足りないのですか?Hehehe

    #include <stdio.h>

    void copy(char a[], char b[]){
        int *apoint = &a;
        printf("%d\n", apoint);
        printf("%d\n", &a);
        *apoint = b;
        printf("%d\n", *apoint);
        printf("%s\n", a);
        printf("%s\n", b);
    }

   int main(void){
        char a[100];
        char b[] = "bluhbluh";

        copy(a,b);
        printf("%d\n", a);
   }
4

6 に答える 6

2

amsが彼/彼女の答えで指摘しているように、配列のコピーが必要な場合は、各エントリを複製する必要があります。配列を複製したくないが、代わりに:aをポイントしたいとします。b

apoint何もしません-aまたはのポインタを変更することはできませんbaそのアドレスまたはポイントしたアドレスを変更する場合はb、それらのアドレスを関数に渡す必要があります。ただし、配列はポインターではないため、これは機能しません。Cで配列を再割り当てできないのはそのためです。ただし、ポインターを変更することはできます。以下は、ポインターをaポイントに変更する例bです。

#include <stdio.h>

void redirect(char** a, char* b){
    *a = b;
}

int main(void){
    char a[100];
    char b[] = "bluhbluh";

    char* apt = a;
    redirect(&apt,b);
    printf("a=%s, b=%s", apt,b);

}
于 2012-11-14T11:25:27.507 に答える
2

それは本当にあまり意味のないCです。警告なしにコンパイルすらしなかったのではないかと思いますか?

最初に配列のアドレスをa取得し、次に配列のアドレスを取得しb、それを整数に変換して(キャストなしで!)、その整数を配列に書き込みaます。次に、mainの最後で、char配列を整数として出力しようとします。

ポインタ演算はそのようには機能しません。:)

私はあなたが本当にこのようなことをするつもりだと思います:

void copy(char a[], char b[]){
    char *ptr_a = a;
    char *ptr_b = b;

    while (*ptr_b != '\0') {
        *ptr_a = *ptr_b;
        ptr_a++;
        ptr_b++;
    }
    *ptr_a = '\0';
}

int main(void){
    char a[100];
    char b[] = "bluhbluh";

    copy(a,b);
    printf("%s\n", a);
}

もちろん、それを行う適切な方法は次のようになります。

#include <string.h>

int main(void){
    char a[100];
    char b[] = "bluhbluh";

    strncpy(a, b, 100);
    printf("%s\n", a);
}
于 2012-11-14T11:19:52.803 に答える
0

apointである必要がありchar*ます、このポインタの割り当てについての警告はありませんか?さらに、文字列のすべての文字を繰り返し処理しているわけではありません...

于 2012-11-14T11:09:38.753 に答える
0

int *apoint = &aが間違っている可能性があります。は&acharへのポインタへのポインタですが、apointはですint *。コンパイルエラーはありませんか?

于 2012-11-14T11:12:58.777 に答える
0

有効にした場合、-Wallまたは-Werrorgccで非常に多くのエラーが表示される場合、charをコピーする方法は適切ではありません。

あなたが望むもの、それはメインのポインタをコピーするだけで可能であり、呼び出す必要はありませんcopy (a,b);

char *a;
char b[]="bluhbluh"
a=b;

文字列「bluhbluh」をポイントし始めました

しかし、私はあなたがあなたがあなたのすべてのキャラクターがarray bにコピーされることを望んでいないと思いますarray a

あなたはこのようにしなければならないでしょう

void copy(char *a,char *b)
{
  while(*b!='\0')
    *a++=*b++;
 }

int main()
{
  char a[100];
  char b[]="bluhbluh";
  copy(a,b);
  printf("%s\n",a);
}
于 2012-11-14T11:15:42.727 に答える
0

コードにいくつかの大きなエラーがあります。特にこの行は正しくint *apoint = &a;ありません。char* *apoint = &a;

//Corrected Code:
#include <stdio.h>

void copy(char a[], char b[]){
    char* *apoint = &a;
    printf("%d\n", apoint);
    printf("%d\n", &a);
    *apoint = b;
    printf("%d\n", *apoint);
    printf("%s\n", a);
    printf("%s\n", b);
}

int main(void){
    char a[100];
    char b[] = "bluhbluh";

    copy(a,b);
    printf("%d\n", a);
}

これは主要なコードの問題を解決しますが、アプローチがあまり適切ではないように思われるため、コピー機能で希望の結果が得られるとは思いません。

于 2012-11-14T11:21:12.450 に答える