2012-11-28 7 views
0

두 번 사용할 때 왜이 코드가 내 코드를 왜 망쳐 놓고 있는지 알고 싶습니다. 내 이해에서, double은 단순히 더 정확한 부동 소수점 숫자입니다. 그러나 다음 코드에서 float를 double로 바꾸면 모든 코드가 입력을 받아서 다시 꺼내더라도 엉뚱한 출력을 얻습니다. 예상대로 열의 행 2를 입력 한 후, 플로트를 사용하는 예에서 float에 비해 홀수 출력을 두 번 생성합니다.

#include <stdio.h> 

int y; 
int z; 
int i; 
int n; 
int r; 
int c; 
float e; 
float d; 

void main() { 
    puts("Enter Row Number:"); 
    scanf("%i", &r); 
    puts("Enter Column Number:"); 
    scanf("%i", &c); 
    float x[r][c]; 
    int j = r; 

    for(y = 1; y <= r; y++) { 
     for(z = 1; z <= c; z++) { 
      scanf("%f", &x[y][z]); 
     } 
    } 
    for (y = 1; y <= r; y++) { 
     for(z = 1; z <= c; z++) { 
      printf("%g\t", x[y][z]); 
     } 
     puts("\n"); 
    } 
} 

, 3은, 그 번호 1-6, I는 1-6의 출력을 얻는다. 그러나 double을 대신 사용하고 입력을 이전과 동일하게 유지하면 {1.36224e-312,1.78905e-307, 1.81506e-307, 3.15957e + 263, 5.3568e-315, 3.44886e-313의 출력을 얻게됩니다. }. 분명히 그것은 정정하기에 더 가깝지도 않습니다. 그리고 여기에 복소수를 다루는 것과 같지 않습니다. 단지 정수 1-6입니다. 뭐라 구요?

+8

double을 쓰는 경우'% lf '로 입력을 읽어야한다 – nhahtdh

+1

'x [r] [c]'와 같은 배열을 정의하면 그 배열에 유효한 인덱스는'0'..'r-1 '및'0'..'c-1'. –

+0

나는 당신의 코드가 1 ... r (r은 데이터 구조의 크기)에서 반복되고 C 배열과 행렬은 0 ... r-1로 번호가 매겨지기 때문에 코드가 세그먼트 화 오류를 생성하지 않는다는 것에 놀란다. –

답변

0

scanf %f은 주소가 float 인 것으로 가정합니다. 실제적으로 float이 아닌 것을보기가 어렵 기 때문에 scanf을 사용하여 데이터를 로컬이 아닌 변수로 직접 읽는 것은 위험합니다. 좀 더 강력한 될 코드이 방식을 바꿀 것입니다 :

float temp; 
scanf("%f", &temp); 
x[y][x] = temp; 
0

귀하의 루프가 잘못 : 당신이 배열을 정의 할 때

for(y = 1; y <= r; y++) { 
    for(z = 1; z <= c; z++) { 

float x[r][c]; 

배열의 인덱스로 간다 0에서 1을 뺀 크기. 그래서 x 배열의 y 제한은 덜보다

x[0] /* first sub-array */ 
x[r - 1] /* last sub-array */ 
그들이 지금 제로에서 시작하는 것이

for(y = 0; y < r; y++) { 
    for(z = 0; z < c; z++) { 

참고로 루프를 변경

이며, 사용하는 대신 비교 연산자.

관련 문제