2016-09-16 10 views
0

C에서 할당을 위해 코딩을하고 있는데 이상한 문제가 발생했습니다. 나는 TXT 파일에 저장되어있는 다음과 같은 내용이 있습니다fscanf를 잘못 사용 했습니까?

11 
1 1 0 1 0 0 0 1 0 0 0 
0 1 1 0 1 0 0 0 1 0 0 
0 0 1 1 0 1 0 0 0 1 0 
0 0 0 1 1 0 1 0 0 0 1 
1 0 0 0 1 1 0 1 0 0 0 
0 1 0 0 0 1 1 0 1 0 0 
0 0 1 0 0 0 1 1 0 1 0 
0 0 0 1 0 0 0 1 1 0 1 
1 0 0 0 1 0 0 0 1 1 0 
0 1 0 0 0 1 0 0 0 1 1 
1 0 1 0 0 0 1 0 0 0 1 

그것은 0과 단지 정방 행렬이, 그리고 맨 번호 (11)는 행렬의 크기입니다.

0 1 1 0 1 0 0 0 1 0 0 
0 0 1 1 0 1 0 0 0 1 0 
0 0 0 1 1 0 1 0 0 0 1 
1 0 0 0 1 1 0 1 0 0 0 
0 1 0 0 0 1 1 0 1 0 0 
0 0 1 0 0 0 1 1 0 1 0 
0 0 0 1 0 0 0 1 1 0 1 
1 0 0 0 1 0 0 0 1 1 0 
0 1 0 0 0 1 0 0 0 1 1 
1 0 1 0 0 0 1 0 44 0 1606415088 

나는 그 마지막 항목이 너무 잘못된 방법 아무 생각이 :

void generateCNF(FILE* f, FILE* g){ 
    int n; 
    fscanf(f,"%d",&n); 
    int i,j; 
    int A[n][n]; // A is where I store my matrix 
    for(i=1;i<=n;i+=1){ 
     for(j=1;j<=n;j+=1){ 
      fscanf(f,"%d",&A[i][j]); 
      printf("%d ",A[i][j]); // I print out A while reading into it 
     } 
     printf("\n"); 
    } 
    //... 
} 

이의 printf가 생성하는 출력은 : 나는 다음과 같은 코드를 사용하여이 파일을 읽습니다. 필자는 텍스트 편집기에서 행렬 파일을 열어 보았는데 완벽하게 잘 보였으므로 fscanf (또는 오히려 그것을 사용함)가 잘못되었다고 생각됩니다.

나를 돕기 위해 필요한 경우 전체 C 파일 (약 90 줄)을 추가 할 수 있지만 불필요하게 게시물을 어지럽히고 싶지는 않습니다.

+2

힌트 : 모든 scanf 함수의 반환 값을 항상 확인하십시오. 그것은 당신에게 어떤 시점에서 두통의 톤을 저장합니다. – hyde

+3

죄송합니다. 제목을 변경했습니다. fscanf는 문서화 된대로 작동합니다. –

+0

@WeatherVane 승인 됨. –

답변

5

매트릭스의 경계를 벗어나고 있습니다. 충돌하지 않으면 소유하지 않은 메모리에 쓰기 때문에 잠재적으로 쓰레기가 생길 것입니다. C의 배열과 행렬은 0으로 인덱싱되므로 n 행렬의 크기는 0에서 n-1까지입니다.

for(i=1;i<=n;i+=1){ 
    for(j=1;j<=n;j+=1){ 

for(i=0;i<n;i+=1){ 
    for(j=0;j<n;j+=1){ 
3

배열 인덱스가 제로에 기초해야한다, 그들은 요소를 뺀 숫자 0에서 이동합니다.

귀하의 경우에는 0에서 n - 1 (포함)까지입니다. 즉 루프는 예를 들어

for(i=0;i<n;i+=1){ 

i0에서 시작, 조건이 i<ni<=n 변경되는 것을 알 수 있습니다.

0

루프의 시작과 끝 지점에서

for(i=0;i<n;i++) 
{ 
    for(j=0;j<n;j+=1) 
    { 
     fscanf(f,"%d",&A[i][j]); 
     printf("%d ",A[i][j]); // I print out A while reading into it 
     } 
     printf("\n"); 
} 

봐와 루프 코드를 바꿉니다. c에서 배열은 인덱스 0에서 시작합니다.

관련 문제