fgets正在通过

时间:2012-10-12 00:16:14

标签: c

这是M x N整数的矩阵。

  • 我要求自动填充或手动填充。
  • 我选择自动,它填充。
  • 然后我测试矩阵以查看它的列(1)或行(0)是否是回文(例如:1 2 9 2 1)。
  • 我要求重启或退出。

如果我重新启动,矩阵会自动填充,这就是我不明白为什么会发生这种情况,因为fgets在while中并且应该始终执行。

功能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;
}

1 个答案:

答案 0 :(得分:0)

问题是函数reiniciar()中的fflush(stdin)没有被读取,因为该函数将返回前一行中的值。 所以我在return 1函数中的reiniciar之前移动了它并解决了它。