Jump to content

Recommended Posts

Posted (edited)

boa noite,antes de mais obrigado pela atenção,

alguém me sabe dizer o porque de quando tento guardar matrizes grandes nesta função as primeiras linhas são apagadas?

linhas e colunas são passados como argumentos sendo apontadores.

char **matr;
int i,x,y;
if (!(scanf ("%d",linhas))) printf("Por favor insira numero de linhas valido");/*guarda o número de linhas*/
if (!(scanf ("%d",colunas))) printf("Por favor insira numero de linhas valido");/*guarda o número de colunas*/
x= *linhas;
y= *colunas;
matr = (char **) malloc((sizeof (char )) * x +1);/*cria espaço na memoria para a matriz*/
for (i=0;i<x;i++){
matr[i]=(char *) malloc((sizeof (char )) * y +1 );
if (!(scanf ("%s",matr[i]))) {printf("linha invalida,por favor insira outra \n");i--;}; /*guarda linhas da matriz*/
if (cad_tamanho(matr[i])!=y) {printf("linha invalida,por favor insira outra \n");i--;}; /*vê se o tamanho da linha guardada é valido*/
}
return matr;

Obrigado.

Edited by Gundares
Tags code + GeSHi + limpeza da formatação
Posted (edited)

Código completo da função:

char** busca_mat(int *linhas,int *colunas) {
char **matr;
int i;
if (!(scanf ("%d",linhas))) printf("Por favor insira numero de linhas valido");/*guarda o número de linhas*/
if (!(scanf ("%d",colunas))) printf("Por favor insira numero de linhas valido");/*guarda o número de colunas*/
matr = (char **) malloc((sizeof (char )) * *linhas );/*cria espaço na memoria para a matriz*/
for (i=0;i<*linhas;i++){
 matr[i]=(char *) malloc((sizeof (char )) * *colunas );
 if (!(scanf ("%s",matr[i]))) {printf("linha invalida,por favor insira outra \n");i--;}; /*guarda linhas da matriz*/
 if (cad_tamanho(matr[i])!=*colunas) {printf("linha invalida,por favor insira outra \n");i--;}; /*vê se o tamanho da linha guardada é valido*/
}
return matr;
}

código de chamada e relevante:

int main () {
char **matriz;
int *linhas,*colunas,i;
linhas=(int) malloc(sizeof(int));
colunas=(int) malloc(sizeof(int));
matriz=busca_mat(linhas,colunas);
printf("linhas=%d colunas=%d \n",*linhas,*colunas);
for(i=0;i<*linhas;i++) {
printf("%s\n",matriz[i]);
}
return 0;
}

o que recebe:

número de linhas (por exemplo: 9)

número de colunas (por exemplo: 9)

matriz (por exemplo:

abcdefghi

jklmnopqr

stuvwxyza

abcdefghi

jklmnopqr

stuvwxyza

abcdefghi

jklmnopqr

stuvwxyza

)

o que espero:

li=9 col=9

abcdefghi

jklmnopqr

stuvwxyza

abcdefghi

jklmnopqr

stuvwxyza

abcdefghi

jklmnopqr

stuvwxyza

o que recebo:

li=9 col=9

0��

���

stuvwxyza

abcdefghi

jklmnopqr

stuvwxyza

abcdefghi

jklmnopqr

stuvwxyza

Edited by Gundares
GeSHi
Posted

este é o problema mais habitual que existe no fórum

(um dia tenho de começar a fazer uma estatística desta coisa ...)

para ver se chegar lá sozinho ou por conhecimento ou por pesquisa aqui no fórum, responde a esta pergunta :

"quantas vezes carregas na tecla ENTER antes de começar a inserir as strings ?"

IRC : sim, é algo que ainda existe >> #p@p
Posted

pois ...

e por acaso a tua aplicação não se dá ao trabalho de apresentar uma daquelas mensagem de : "ao não gosto da tua string" que tens no teu código ?

é que se não apresenta é porque a tua função cad_tamanho está mal ou está a acontecer uma coincidência muito, mas mesmo muito grande ...

IRC : sim, é algo que ainda existe >> #p@p
Posted

vais fazer esta brincadeira :

#define CLEAR_INPUT while (getchar() != '\n') /* void */

char** busca_mat(int *linhas,int *colunas) {
 char **matr;
 int i;

 if (!(scanf ("%d",linhas))) printf("Por favor insira numero de linhas valido");/*guarda o número de linhas*/
 CLEAR_INPUT;

 if (!(scanf ("%d",colunas))) printf("Por favor insira numero de linhas valido");/*guarda o número de colunas*/
 CLEAR_INPUT;


 matr = (char **) malloc((sizeof (char )) * *linhas );/*cria espaço na memoria para a matriz*/
 for (i=0;i<*linhas;i++){
   matr[i]=(char *) malloc((sizeof (char )) * *colunas );
   if (!(scanf ("%s",matr[i]))) {printf("linha invalida,por favor insira outra \n");i--;};

   // pensa neste if caso o primeiro falhe ...
   if (cad_tamanho(matr[i])!=*colunas) {printf("linha invalida,por favor insira outra \n");i--;};
 }

 return matr;
}

e se funcionar tudo bem, pesquisa na net sobre "clear input buffer"

IRC : sim, é algo que ainda existe >> #p@p
Posted

Vi esta solução feita por professores na universidade, pensei que estava correta.

int cad_tamanho (char s[])
   {
   int p;
   p=0;
   while (s[p]!='\0') p++;
   return p;
   }

Ok obrigado pela ajuda, depois quando testar esta função deixo feedback 😄

Posted (edited)

Ok obrigado pela ajuda correu bem mas tive que em vez de usar o

#define CLEAR_INPUT while (getchar() != '\n') /*void*/

visto isto não funcionar,criei a função

void clear (void)
{
while ( getchar() != '\n' );
}

e também percebi o porque de a usar , obrigado ;D

Edited by Gundares

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.