Ir ao conteúdo
  • Cadastre-se

Alocação Dinâmica de Memória usando vetores de Strings


Victor.main
Ir à solução Resolvido por Midori,

Posts recomendados

Bom dia pessoal.
Estou com um trabalho bem grandinho pra fazer, sobre um jogo de senhas envolvendo cores, onde o computador terá que criar uma senha e o usuário entrar com uma. Ai deverá ser mostrado os acertos e tal..
Porém, nesse jogo o usuário deverá entrar com os parâmetros, por exemplo, o número de cores disponíveis, o tamanho da senha, o limite de jogadas... E, por isso, o programa deve ser feito consumindo o minimo de memória possivel. Pra isso, malloc!
Mas me surgiu uma dúvida sobre como estou usando a função errada. Vou explicar, no jogo, as cores são representadas por abreviações (vermelho = vm, azul = az...). Ai ao criar o vetor char de duas posições para armazenar as cores.. surgiu ma dúvida: Precisarei criar um vetor contendo vetores do tipo char[2] para armazenar as jogadas???
 
Parte do meu código:

 

  //n = tamanho de senha
  //pc = posibilidade de cores
  //lim = limite de jogadas
  //ran = numero "randômico"
  int n, pc, lim, ran, i;  
  char *vs; //vs = vetor sorteado
  printf("Qual o Tamanho de Senha Desejado? (de 4 a 12) ");
  scanf("%d\n", &n);
  while ((n < 4) || (n > 12)) {
    printf("Tamanho incorreto, por favor, digite um número entre 4 e 12: ");
    scanf("%d\n", &n);
  }
  printf("Qual o Número de Possibilidades de Cores Desejado? (de 3 a 6) ");    
  scanf("%d\n", &pc);
  while ((pc < 3) || (pc > 6)) {
    printf("Número incorreto, por favor, digite um número entre 3 e 6: ");
    scanf("%d\n", &pc);
  }
  printf("Qual o  Limite de tentativas de adivinhação? (a partir de 1)");
  scanf("%d\n", &lim);
  while (lim < 1) {
    printf("Número incorreto, por favor, digite um número acima de 1: ");
    scanf("%d\n", &lim);
  }
//Criando a senha sorteada pelo computador
  vs = (char *)malloc(n*sizeof(2));
  for (i=0; i<=(n-1); i++) {
    ran = rand()%(pc-1);
    switch(ran) {
      case 0:
           vs = "vm";
           break;
      case 1:
           vs = "vd";
           break;
      case 2:
           vs = "am";
           break;
      case 3:
           vs = "az";
           break;
      case 4:
           vs = "mg";
           break;
      case 5:
           vs = "ci";
           break;
    }
  }
 

Link para o comentário
Compartilhar em outros sites

Nesse caso você vai ter que criar uma matriz, usando ponteiro de ponteiro, para alocar a quantidade de palavras e depois a quantidade de caracteres.

Por exemplo,

 

char **vs;..vs = (char**)malloc(sizeof(char*) * 6));..vs[i] = (char*)malloc(3);..strcpy(vs[0], "vm");strcpy(vs[1], "vd");

Obrigado! Compilou tudo certinho mas dá uma falha de segmentação ao final... Nesse trecho de código vocÊ usa o 6 como sendo o número de palavras e o 3 comop sendo a quantidade de caracteres?

Porque troquei as variáveis para n e char * 2 (já que as abreviações das cores são todas com 2 caracteres..

 

char **vs;

  vs = (char**)malloc(sizeof(char*) * n);

  vs = (char*)malloc(sizeof(char)*2);

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

    ran = rand()%(pc-1);

    switch(ran) {

      case 0:

           strcpy(vs[0], "vm");

           break;

      case 1:

           strcpy(vs[1], "vd");

           break;

 

.

.

.

Link para o comentário
Compartilhar em outros sites

  • Solução

Você deve reservar espaço para 3 caracteres para as cores, por que todas as strings devem terminar com \0. Então quando você passar 'vm', a string será vm\0.

A string deve ser passada após alocar espaço para cada indice. Segue um exemplo,

    char **vs = (char **)malloc(sizeof(char*) * 4);    int i;    for(i = 0; i < 4; i++){        vs[i] = (char *)malloc(3);        switch(i){            case 0: strcpy(vs[i], "vm"); break;            case 1: strcpy(vs[i], "vd"); break;            case 2: strcpy(vs[i], "az"); break;            case 3: strcpy(vs[i], "mg"); break;        }    }    for(i = 0; i < 4; i++){        printf("%s\n", vs[i]);        free(vs[i]);    }    free(vs);
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!