Ir ao conteúdo
  • Cadastre-se
Vítor Lyrio

C Imprimindo Strings Armazenadas em um Vetor

Recommended Posts

Então galera, to com uma dificuldade meio ridícula quanto a impressão de strings.

OBS.: usando apenas a biblioteca <stdio.h>.

Preciso armazenar mais de uma string em um vetor.

Ex.: Um vetor com 2 espaços (índices 1 e 0), no índice 0, armazeno "batata" e no 1 "jujuba".

Depois quero imprimir separadamente cada string.

Ex.:

          printf("%s",vetor[0]);
          printf("%s",vetor[1]);

Eu consegui fazer o básico,  padrão:

          printf("Digite um nome: ");
          scanf("%s",&vetor);
          printf("%s",vetor);

 

Desse jeito da certo, mas preciso imprimir strings de diferentes índices separadamente, como nome e sobrenome.

          

Editado por Simon Viegas
Inserir tag CODE
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você quer uma matriz ao invés de um vetor.

 

char matriz[2][100];

printf("Digite o nome:");
scanf(" %100s", matriz[0]);

printf("Digite o sobrenome:");
scanf(" %100s", matriz[1]);

printf("\n%s %s\n", matriz[0], matriz[1]);

 

  • Curtir 2
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Fiz esse exercício trabalhando com ponteiro e alocação dinâmica. Mas daí precisa da biblioteca <stdlib.h>. Mas foi apenas p praticar:

 

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

int main() {

    char **vet = NULL;
    int i;

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

    for (i = 0; i < 2; i++) {
        vet[i] = malloc(40 * sizeof(char));
    }

    for (i = 0; i < 2; i++) {
        printf("Digite uma palavra: ");
        scanf("%40s", vet[i]);
    }

    for (i = 0; i < 2; i++)
        printf("%s\t", vet[i]);

    for (i = 0; i < 2; i++) {
        free(vet[i]);        
    }

    free(vet);

    vet = NULL;

    return 0;
}

Para um vetor de strings é preciso criar uma matriz bidimensional mesmo

  • Curtir 2
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d Veja outro jeito que usa apenas 1 malloc:

 

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

int main() {

    char (*vet)[40] = NULL;
    int i;

    vet = malloc(2 * sizeof *vet);
  
    for (i = 0; i < 2; i++) {
        printf("Digite uma palavra: ");
        scanf("%40s", vet[i]);
    }

    for (i = 0; i < 2; i++) {
        printf("%s\t", vet[i]);
    }

    free(vet);

    vet = NULL;

    return 0;
}

 

A notação "<tipo> (*ponteiro)[m];" cria um ponteiro para um vetor de tamanho m, ou seja um ponteiro que aponta para um vetor inteiro ao invés de uma única variável, então esse ponteiro contém a informação do tamanho do vetor, e toda vez que incrementar sobre o ponteiro *(ponteiro + 1) vai estar incrementando a posição proporcionalmente ao tamanho do vetor.

 

Logo, podemos usar isso para criar uma matriz de n linhas e m colunas usando memória alocada dinamicamente assim:

int (*matriz)[m] = malloc(n * m * sizeof(int));

//ou

int (*matriz)[m] = malloc(n * sizeof *matriz);

Pois o ponteiro aponta para uma linha inteira da matriz, e incrementando sobre o ponteiro passa para a próxima linha.

 

Ou seja, podemos acessar a matriz normalmente:

for (int i = 0; i < n; i++){
    for (int j = 0; j < m; j++){
        matriz[i][j];
    }
}

Pois o primeiro colchetes incrementa sobre o ponteiro, e o segundo colchetes sobre as posições do vetor para o qual o ponteiro aponta.

 

As vantagens de fazer assim é que pode usar apenas 1 free() para liberar a memória alocada, e a memória é reservada de uma vez para a matriz inteira, então a matriz fica toda agrupada continuamente na memória.

 

 

 

Quando usa-se vários mallocs para reservar memória para a matriz, cada malloc reserva memória em um lugar diferente da memória, então a matriz fica espalhada em vários lugares da memória, perdendo em desempenho quando comparado a alocando toda de uma vez. Além de ter que checar que cada uma das alocações tiveram sucesso em alocar a memória, e não pode esquecer liberar 1 por 1, ou seja a chance de ocorrer memory leak é maior.

 

(Mas talvez já tenhamos saído demais do assunto do tópico. :P )

Editado por isrnick
  • Obrigado 1
  • Amei 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick

1 hora atrás, isrnick disse:

(Mas talvez já tenhamos saído demais do assunto do tópico. :P )

 

Sem problemas. Obrigado pela explicação dada. Isso ajuda muito!

É dessa forma q se aprende algo q para mim, até então, era um ponto q desconhecia com relação a alocação dinâmica de memória. Valeu!

Editado por giu_d
  • Curtir 2
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×