2016-06-25 12 views
-1

ユーザ入力配列を取り、関数に行き、各数値の間にゼロを追加して配列2に保存するコードを書き直そうとしています。私のソースコードはうまく動作しますが、関数が各配列要素を訪れるだけのポインタ演算を使用するようにするには、スクリプトをサブスクリプト化することはできません。 自分のコードやこれを行う方法の提案について教えてください。C配列ポインタ算術

ソースコード:

#include <stdio.h> 

void insert0(int n, int a1[], int a2[]); 

int main(void) { 

    int i;  
    int n; 

    printf("Please enter the length of the input array: "); 
    scanf("%d", &n); 

    int a[n]; 
    int b[2*n]; 

    printf("Enter %d numbers for the array: ", n); 
    for (i = 0; i < n; i++){  
     scanf("%d", &a[i]); 
    } 

    insert0(n, a, b); 

    printf("Output array:"); 
    for (i = 0; i < 2*n; i++){ 
     printf(" %d", b[i]); 
     printf("\n"); 
    } 
    return 0; 
} 

void insert0(int n, int a[], int b[]) { 

    int i, j = 0; 

    for(i = 0; i < n; i++, j+=2){  
    b[j]= a[i];  
     b[j+1] = 0; 
    } 
} 

マイ算術:

#include <stdio.h> 

    void insert0(int n, int *a1, int *a2); 

    int main(void) { 

     int i;  
     int n; 

     printf("Please enter the length of the input array: "); 
     scanf("%d", &n); 

     int a1[n]; 
     int a2[2*n]; 

     printf("Enter %d numbers for the array: ", n); 
     for (i = 0; i < n; i++){  
      scanf("%d", &a2[i]); 
     } 

//not sure if this is how you call it, I've seen it called with arr 
     insert0(n, a1, a2); 

     printf("Output array:"); 
     for (i = 0; i < 2*n; i++){ 
      printf(" %d", a2[i]); 
      printf("\n"); 
     } 
     return 0; 
    } 

    void insert0(int n, int *a1, int *a2) { 

     int *p; 
     int j = 0; 

     // I think I translated this properly  
     for(p = a1; p < a1+n; p++, j+=2){ 
      a2+j = a1+p; 
      //unsure how to get a2[j+1] to still work here with pointer 
      a2(j+1) = 0; 
     } 
    } 

答えて

0

これは、ポインタ演算を使用して、効率のデモであることが意図されていない応答である、むしろ配列のインデックス(添え字)は、ポインタ演算に変換する方法を示すためには、あなたに適用されますコード。 標準からの貴重な情報を含むthis SO postをご覧ください。

あなたのコードには論理的なバグがほとんどなく、間違った配列の読み込みや書き込みなどもあります。自分で簡単に見つけることができます。あなたがここにあればelse文を使用する方法

#include <stdio.h> 

void insert0(int n, int *a1, int *a2) { 
    int p; //just a normal int for counter 
    int j = 0; 

    for(p = 0; p < n; p++, j+=2){ 
     *(a2+j) = *(a1+p); //values pointed at are getting assigned 
          //equivalent to a2[j] = a1[p] 
     if(p < n - 1)  //we insert only between numbers 
     *(a2 + j + 1) = 0; //pointer pointing at memory into which 0 is copied incremented by 1 
    } 
} 


int main(void) { 
    int i;  
    int n; 

    printf("Please enter the length of the input array: "); 
    scanf("%d", &n); 

    int a1[n]; 
    int a2[2*n]; //one element too long, should be a2[n+n-1]; 

    printf("Enter %d numbers for the array: ", n); //reading into smaller array 
    for (i = 0; i < n; i++){  
     scanf("%d", &a1[i]); 
    } 

    insert0 (n, a1, a2); //this is OK 

    printf("Output array: "); 
    for (i = 0; i < 2*n - 1; i++){ 
    printf(" %d", a2[i]);    //printing from the bigger, zero-padded array 
    } 
    printf("\n"); 
    return 0; 
} 
+0

返信を改善するためにDVerにご意見ありがとうございますか?ありがとう – user3078414

+0

あなたの返信はしっかりしていて、ポインタ算術を使う方法を簡単に示しています。私の意見では(指針算術に対する初心者でも)それは単純であり、改善する必要はありません。私はそれを使用して、将来ポインタの算術演算を使用する必要があるときにそれをもう一度見直してみましょう。 – user6124417

2

あなたのポインタを間接参照する必要があります。

a2+j = a1+p; 

効果がありません。これは、「アドレスa2 + jをアドレスa1 + pに設定する」と言いますが、これは実行できません。 A1 + Pに格納された値にA2 + Jに格納された値を設定するには、これを実行する必要があります。

*(a2+j) = *(a1+p) 

あなたは括弧内の自分のポインタ演算を囲み、その上に間接参照演算子を使用する必要があります。

a1 + pしかし、あなたが望むアドレスではありません。 pはオフセットだけでなく実際のアドレスを格納しているので、おそらくpが必要です。

1

問題1:あなたのコードではここ

int a1[n]; 
int a2[2*n]; 

printf("Enter %d numbers for the array: ", n); 

for (i = 0; i < n; i++) 
{  
    scanf("%d", &a2[i]); //maybe you are using wrong array to input elements 
} 
  • 私はあなたがそれのサイズはnであり、あなたがn要素をスキャンするようa1配列に要素をスキャンする必要があり、ここだと思います。 ..
  • ですが、要素をa2、さらにinsert0() fuにスキャンしています

    スキャン要素

    for (i = 0; i < n; i++) 
    {  
        scanf("%d", &a1[i]); //scanning into `a1` 
    } 
    

    a1へ:nctionあなたは

ソリューション...初期化されていないa1の助けを借りてa2の要素を書き換えています問題2:

  • :注意すべきもう一つのポイントは、あなたが数字Iの間でゼロだけを割り当てるようa2[]ため、(2*n)-1要素は十分にあるということです。E、

例:

1,1,1 // 3 elements 

1,0,1,0,1 // (2*3)-1=5 elements after inserting 

ソリューション:

printf("Please enter the length of the input array: "); 
    scanf("%d", &n); 

    int a1[n]; 
    int a2[(2*n)-1]; 

、最後に....

しかし、私はそれが各配列要素を訪問する関数のためだけにポインタ演算を使用するようにしようとしているが、スクリプトをサブスクリプト化することはできない。

はい、サブスクリプトを使用できます。

この方法:

void insert0(int n, int *a1, int *a2) 
{ 

    int j = 0; 

    for(j=0;j<(2*n)-1; j++) 
    { 
     if(j%2!=0) 
      a2[j]=0; 
     else 
      a2[j]=a1[j/2]; 
    } 
} 

だからあなたコードは次のようになります。

#include <stdio.h> 

    void insert0(int n, int *a1, int *a2); 

    int main(void) 
    { 

    int i; 
    int n; 

    printf("Please enter the length of the input array: "); 
    scanf("%d", &n); 

    int a1[n]; 
    int a2[(2*n)-1]; 

    printf("Enter %d numbers for the array: ", n); 
    for (i = 0; i < n; i++) 
    { 
     scanf("%d", &a1[i]); 
    } 

    insert0(n, a1, a2); 

    printf("Output array:"); 
    for (i = 0; i < 2*n-1; i++) 
    { 
     printf(" %d", a2[i]); 
     printf("\n"); 
    } 
    return 0; 
} 

void insert0(int n, int *a1, int *a2) 
{ 

    int j = 0; 

    for(j=0;j<(2*n)-1; j++) 
    { 
     if(j%2!=0) 
      a2[j]=0; 
     else 
      a2[j]=a1[j/2]; 
    } 
} 

入力:

3 
1 2 3 

出力:

1 
0 
2 
0 
3 
+1

非常に興味深い:ここで働いて修正です。私はそれを考えなかった。それでも良いと非常に有用な返信。 – user6124417

+0

問題なし@ user6124417 :) – Cherubim