2012-05-04 2 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; 
} 

그리고 입력 데이터

2 
4 
25 20 30 90 
3 
45 50 55 

입니다 그리고 그 결과는 잘

25 20 30 90 
45 50 55 

입니다. 그러나, 입력이 ?? 왜 출력은 위와 같이이 될

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 

좋고, 간단한 질문이 닮아

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

결과 닮아 2보다 위에 입력하면 같은 결과가 발생합니다. 가능한 모든 답변과 링크가 마음에 들지 않으면 ?? 감사합니다

+0

여기서 수행하려는 작업을 분명히하는 데 도움이 될 것이라고 생각합니다. 특별한 이유로 2D 어레이를 사용하고 싶습니까? 다양한 길이의 행을 원하십니까? 목표는 무엇입니까? 행 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 배열을 사용하지 마십시오. 다이나믹 할당을 사용해야하며 크기를 얻은 후에 각 행에 적절한 메모리를 할당해야합니다. – MByD

+0

크기를 유지하려면 치수를 입력하는 모든 숫자가 t보다 작은 지 확인하십시오. 예를 들어 (j = 0; j Justin

0

그런 다음, 크기 t*t와 매트릭스를 구축 다소 요소와 행에 입력합니다.

너무 적은 요소로 행을 채울 경우 나머지는 초기화되지 않은 상태로 유지되며 이상한 숫자가 표시됩니다. 이 요소들을 인쇄하지 않기 때문에 귀하의 경우에는 괜찮습니다.

너무 많은 요소가있는 행을 채울 경우 초과 된 행은 다음 행에 겹칩니다. 또한 전체 행렬을 초과하여 스택을 손상시킬 수 있습니다.
이게 무슨 일인 것 같아. n 배열이 오버런되어 코드가 이상해진다.

+0

흠, 아니, 내가 예상 한 결과는 첫 번째 예와 같습니다. –

+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. scanf("%ld", &d[j][i]); "i"와 "j"를 교환해야합니다.