2012-05-04 5 views
0

まず、私は自分のコードに論理エラーがあります。まあ、それは私が期待したものだ、これはコードscanf()のエラー

#include <stdio.h> 

int main() 
{ 
    long i,j,t; 
    scanf("%ld",&t); 
    long n[t],d[t][t]; 
    for(i = 0; i < t;i++){ 
     scanf("%ld",&n[i]); 
     for(j = 0; j < n[i] ;j++){ 
      scanf("%ld",&d[j][i]); 
     } 
    } 
    for(i = 0; i < t;i++){ 
     for(j = 0; j < n[i] ;j++){ 
      printf("%ld ",d[j][i]); 
     } 
     printf("\n"); 
    } 
    return 0; 
} 

そしてI入力データ

2 
4 
25 20 30 90 
3 
45 50 55 

され、結果はまあ

25 20 30 90 
45 50 55 

です。しかし、入力はこの

3 
5 
12 67 89 34 56 
6 
34 56 78 90 12 34 
7 
12 34 89 23 56 78 89 

この

12 34 89 23 56 78 89 
12 67 89 34 56 4206692 7 2293472 1982002386 16 3 2293344 2293408 0 2293552 0 0 4 
198585 8918456 1982106837 1982010910 8918456 2293640 0 0 1985286516 2009576437 0 
0 2293664 2009323341 2293740 2147348480 0 
34 56 78 90 12 34 4199405 1982595752 8 12 2293424 2 2 1982356412 2147348480 2293 
608 2147348480 1 -1 297753669 1982010784 1982015505 4199044 0 0 2147348480 21473 
48480 0 0 0 7273647 2009576392 0 0 0 1 0 20 52 0 0 438759246 736 -214797894 1420 
760826203 2272 852421325 3108 944791496 4028 -1322777276 4988 9 1 1 1204 7168 4 
2 152 11832 7 1 40 12316 1682469715 1 140 44 0 0 0 2 0 7209065 5701724 6029427 

12 34 89 23 56 78 89 

まあ、出力が上記のようになる理由は単純な質問のようになった結果のようになります?私が2より上に入力すると、同じ結果が起こります。あなたがそれを気にしないなら、可能な答えとリンクはありますか?ありがとう

+0

ここで達成しようとしていることを明確にするのに役立つと思います。特定の理由で2次元配列を使いたいですか?あなたは様々な長さの行を持っていますか?目標は何ですか?行5の位置3の要素に即座にアクセスできるようにしたいですか?詳細は、良い解決策を見つけるのに役立ちます。 – Justin

+0

最初の例では、 'd'を' long [2] [2] 'と宣言し、それに4つのデータを入れます。プログラムのメモリ割り当てが外れています。それはC –

答えて

1

多くの場合2D配列の外側に書いていますが、エラーが発生しないこともありますが、それはまさに偶然です。

あなたは、入力される配列の数によって2次元配列のサイズを決定しますが、同時に、内側の配列のサイズを決定します。

scanf("%ld",&t); 
long n[t],d[t][t]; 

したがって、たとえば、のは、見てみましょう最初の例:

2    >> create array n[2], and array d[2][2] 
4    >> number of values to d[0] 
25 20 30 90 >> d[0][1] = 25 d[0][2] = 20 you access d[0][3] and d[0][4] but you are not allowed to do that. 
3    >> number of values to d[1] 
45 50 55  >> d[1][0] = 45 d[1][1] = 50 you access d[1][2] but you are not allowed to do that 
+0

で非常に基本的なので、配列の次元を変更する必要がありますか?または論理的なエラーを防ぐために任意のソリューション?? –

+0

このような2D配列は使用しないでください。おそらく、dynaicの割り当てを使用する必要があります。各行に対して、サイズを取得した後、適切なメモリを割り当てます。 – MByD

+0

あなたがサイズを保持したい場合は、寸法を指定して入力するすべての数値がt未満であることを確認してください。たとえば、(j = 0; j Justin

0

あなたは多かれ少なかれ要素を持つ行に記入した後、サイズt*tの行列を構築します。

要素の数が少なすぎる行を塗りつぶした場合、残りの要素は初期化されずに残り、奇妙な数が発生します。これらの要素を印刷しないので、あなたの場合は問題ありません。

要素数が多すぎる行を塗りつぶした場合、余分な行が次の行に重なって表示されます。また、行列全体を超えてスタックを破損する可能性があります。
あなたのn配列がオーバーランしてしまい、コードが狂ってしまいます。

+0

hmm、いいえ、私が期待した結果は最初の例のようです。 –

+0

私はあなたが期待していたことを理解していますが、配列の外側に書くと、あなたは期待したものを得られません。 – ugoren

0

私はあなたがmallocを使用できると信じています。

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    long i,j,t; 
    printf("Rows : "); 
    scanf("%ld",&t); 
    long *n; 
    long **d; 
    n = (long*)malloc(sizeof(long) * t); // add malloc 
    d = (long**)malloc(sizeof(long *) * t); // add malloc 

    for(i = 0; i < t;i++){ 
     printf("Column : "); 
     scanf("%ld",&n[i]); 
     d[i] = (long*)malloc(sizeof(long) * n[i]); //add malloc 
     if(d[i] == NULL) 
     printf("ERROR\n"); 

     for(j = 0; j < n[i] ;j++){ 
      scanf("%ld", &d[i][j]); // change from &d[j][i] 
     } 
    } 
    printf("\n\n"); 
    for(i = 0; i < t;i++){ 
     for(j = 0; j < n[i] ;j++){ 
      printf("%ld ",d[i][j]); // change from d[j][i] 
     } 
     printf("\n"); 
    } 
    return 0; 
} 

まあ、出力が上記のようになる理由は簡単な質問、? Iが2より上に入力されると、同じ結果が発生します。可能であれば、 の回答とリンクは可能ですか?おかげ

  1. あなたが使用されるよりも少ないメモリを割り当てるため。
  2. ​​"i"と "j"を交換する必要があります。