2012-10-12 63 views
0

這是一個矩陣M x N整數。fgets正在通過

  • 我要求自動填充或手動填充。
  • 我選擇自動填充。
  • 然後,我測試矩陣以查看其列(1)或行(0)是否是迴文(例如:1 2 9 2 1)。
  • 我要求重新啓動或退出。

如果我重新啓動,矩陣自動填充,這就是我不明白爲什麼會發生,因爲fgets是在內部,並應始終執行。

功能llenar_matriz,管線4

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

#define COL 5 
#define FIL 5 

int reiniciar(void); 
void llenar_matriz(int mat[ FIL ][ COL ]); 
void imprimir_matriz(int mat[ FIL ][ COL ]); 
int matriz_palindrome(int mat[ FIL ][ COL ], int tipo); 

int main() { 
    do { 
     int mat[ FIL ][ COL ] = {0}; 
     llenar_matriz(mat); 
     if (matriz_palindrome(mat, 1)) { 
      puts("Las columnas de la matriz son palindromos"); 
     } 
     else { 
      puts("Las columnas de la matriz no son todas palindromos"); 
     } 
    } while(reiniciar()); 
    system("pause"); 
} 

void imprimir_matriz(int mat[ FIL ][ COL ]) { 
    int i, j; 
    for(i = 0; i < FIL; i ++) { 
     for(j = 0; j < COL; j++) { 
      printf("%4d", mat[ i ][ j ]); 
     } 
     printf("\n"); 
    } 
} 

void llenar_matriz(int mat[ FIL ][ COL ]) { 
    char rta[3]; 
    int i, j; 
    printf("Desea llenar la matriz automaticamente? Si/No\n"); 
    while(fgets(rta, 3, stdin) == NULL) { 
     fflush(stdin); 
     printf("Ocurrio un error al obtener su respuesta. Intente nuevamente.\n"); 
    } 
    if(strcmp(rta, "No") == 0 | strcmp(rta, "no") == 0) { 
     for(i = 0; i < FIL; i++) { 
      for(j = 0; j < COL; j++) { 
       printf("Ingrese el valor de la posicion %d, %d\n", i+1, j+1); 
       while(scanf("%d", &mat[ i ][ j ]) == NULL) { 
        fflush(stdin); 
        puts("Hubo un error al obtener su respuesta. Intente nuevamente"); 
       } 
       imprimir_matriz(mat); 
      } 
     } 
    } 
    else { 
     srand(time(NULL)); 
     for(i = 0; i < FIL; i++) { 
      for(j = 0; j < COL; j++) { 
       mat[ i ][ j ] = rand() % 99 + 1; 
      } 
     } 
     imprimir_matriz(mat); 
    } 
    fflush(stdin); 
} 

int reiniciar(void) { 
    char rta[3]; 
    int centinel = 0; 
    puts("Desea reiniciar la prueba? Si/No"); 
    do{ 
     while(fgets(rta, 3, stdin) == NULL) { 
      fflush(stdin); 
      printf("Ocurrio un error al obtener su respuesta. Intente nuevamente.\n"); 
     } 
     if(strcmp(rta, "Si") == 0 | strcmp(rta, "si") == 0) { 
      return 1; 
     } 
     else { 
      if(strcmp(rta, "No") == 0 | strcmp(rta, "no") == 0) { 
       return 0; 
      } 
      else { 
       printf("Respuesta incorrecta. Intente nuevamente.\n"); 
       centinel = 1; 
      } 
     } 
     fflush(stdin); 
    } while(centinel); 
} 

int matriz_palindrome(int mat[ FIL ][ COL ], int tipo) { 
    int i, j; 
    if(tipo == 0) { 
     for(i = 0; i < FIL; i++) { 
      for(j = 0; j <= COL/2; j++) { 
       if(mat[ i ][ j ] != mat[ i ][ COL - j - 1]) { 
        return 0; 
       } 
      } 
     } 
    } 
    if(tipo == 1) { 
     for(i = 0; i < COL; i++) { 
      for(j = 0; j <= FIL/2; j++) { 
       if(mat[ j ][ i ] != mat[ FIL - j - 1 ][ i ]) { 
       return 0; 
      } 
      } 
     } 
    } 
    return 1; 
} 
+0

你發佈你的整個應用程序的事實表明你沒有努力找到問題。提出一個* short *代碼,它會產生相同的問題。 –

+1

@KarolyHorvath我確實付出了努力,實際上我已經解決了這個問題,但是我把整個代碼放在了你的需要的地方。我明確表示函數是llenar_matriz,在第4行中,失敗了。但這不是你只需要調試這個功能的東西,這就是爲什麼我放置完整的代碼。 – JorgeeFG

回答

0

問題是在功能reiniciar該fflush(標準輸入)()沒有被讀取時,因爲該函數將返回在先前行的值。 所以我把它移到return 1之前的reiniciar函數中,並解決了它。

+1

刷新stdin是UB。 http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1052863818&id=1043284351 – Morpfh