C - Input Matriz bidimensional - help.

DarTaKaum

Power Member
Bem eh o seguinte tou a fazer um programa k vai usar uma sopa de letras,
o input eh do tipo:

nr. de colunas
nr. de linhas
sopa

ex:

3
3
qwe
asd
zxc

tenho feito este codigo mas está-me smp a dar um erro de segmentation fault.

Que eh que esta errado?
Código:
int main ()
{
  int linhas,colunas,i;
  char matriz[linhas][colunas];

  void getmatriz(int linhas,int colunas)
  {
     for (i=0; i < linhas; i++)
	 fgets(matriz[i],colunas,stdin);
	  
  }

  scanf(" %d",&colunas);
  scanf(" %d",&linhas);
  
  getmatriz(linhas,colunas);
 
  return 0;
        }

thkx.
 
kanguru disse:
Não podes definir a matriz[linhas][colunas] se tu ainda não sabes o tamanho que vai ter :P

E então como é que ele fazia a matriz? Com as mãos??? Está definido desde o início que é uma matrix bidireccional...

Btw, embora n seja o melhor método, utilizava IF's encadeados de forma a preencher a matriz. Foi o método que aprendi:

if (i=0; i++; i<linha)
if (j=0; j++ ; j<coluna)
matriz [linha][coluna]

Depois para o display da matriz, prinf encadeado em mais dois If's com contadores...
 
Já não me lembro muito de C, mas esse fgets parece-me errado. O fgets lê uma linha inteira, e segundo o que entendo tu queres posicionar um unico caracter em cada posição da matriz.

fgets(genero, tamanho maximo, fonte).

Acho que deverias de facto ler as linhas, mas caracter a caracter e ir inserindo na matriz.


De resto será muito mais fácil neste e noutros trabalhos que venhas a fazer (especialmente se forem mais complexos) se usares um debugger, como o gdb que vem no Linux.

Boa sorte
 
volto a repetir... akilo da prego logo no:
char matriz[a];
Porque dentro do a e b está lixo. Tens que fazer com apontadores


char **matriz;
scanf(" %d",&colunas);
scanf(" %d",&linhas);
matriz = (char **) malloc(linhas*sizeof(char*);
for (i=0; i< linhas; i++)
matriz = (char) malloc(colunas*sizeof(char));

Não ker dizer ke este kodigo esteja 100% certo, mas é para teres uma ideia de como isso se faz. Tem que ser com memória dinâmica. Boa sorte.

Usa o gdb para debug, mas se o fores usar no programa komo tens aí ele mal entra no main dá seg fault.
 
Bem a não ser que eu esteja bêbedo ou mt eskecido de C (já não faço nada com isso há quase 1 ano, pra ser sincero =/ ) o problema é estares a declarar uma matriz[ a ][ b ] sem teres o 'a' e o 'b' inicializados.
Agora assim de repente não sei como se faz em C, só me lembro em Java! lol!

Bad Way:
int x, y;
int[][] matriz = new int[ x ][ y ];


Good Way:
int[][] matriz;
int x = 5;
int y = 3;
matriz = new int[ x ][ y ];

algures por esses moldes... em C deve ser algo parecido, suponho eu :)
Boa sorte :P
 
Última edição:
tha only f*cking good way: :x2:

Código:
#define NUMERO_LINHAS 50
#define NUMERO_COLUNAS 50

int **matriz, i=0;
matriz = (int**)calloc(NUMERO_LINHAS, sizeof(int*));
  for(i=0; i<NUMERO_COLUNAS; i++)
      matriz[i]=(int *)calloc(NUMERO_COLUNAS, sizeof(int));

nao eskecer de fazer free() antes do return da main ou exit() ao longo do codigo!

[[]]
 
Código:
#include <stdio.h>
#include <stdlib.h>

void getmatriz(char** matriz, int linhas, int colunas) {
        int i ;
        for (i=0; i < linhas; i++) {
                matriz[i] = malloc(sizeof(char) * (colunas+2)) ;
                fgets(matriz[i],colunas+2,stdin);
        }
}


int main () {
        int linhas ;
        int colunas ;
        char* tlinhas = malloc(2) ;
        char* tcolunas = malloc(2) ;

        fgets(tlinhas, 2, stdin) ;
        fgets(tcolunas, 2, stdin) ;

        linhas = atoi(tlinhas) ;
        colunas = atoi(tcolunas) ;

        free(tlinhas) ;
        free(tcolunas) ;

        char** matriz = malloc(sizeof(char) * linhas) ;

        getmatriz(matriz, linhas,colunas) ;

        return 0 ;
}
Este código está a funcionar, testei-o e deu certo. Provavelmente há uma maneira mais simples de o fazer, mas não gosto de scanf, fgets all the way! ;) Qualquer dúvida, é perguntar.


EDIT: as palavras tão a ficar com um \n (newline) no fim, se não quiseres que isso aconteça basta colocar dentro da função for, no fim,
Código:
matriz[i][colunas+1] = '\0' ;
 
Última edição:
Back
Topo