Ir ao conteúdo

C Matriz de string para dados


Ir à solução Resolvido por Midori,

Posts recomendados

Postado

O programa solicita nome, RG, cidade natal e endereço. Utilizar como estrutura de dados uma matriz de string para cada uma das quatro informações. O programa termina quando o usuário pressiona q.  Ao final do programa deve ser impressa toda a base de dados. Prover espaço de registro para ate 50 pessoas.

 

Tentei dessa forma mas não deu certo, como posso fazer? O raciocínio está errado?

 

#include <stdio.h>
#include <string.h>
int main ()
{
char str1 [5][100];
char str2 [5][100];
char str3 [5][100];
char str4 [5][100];
int count=0;
char FLAG[10] = "q";
int totalnums;

do
{
    printf ("\nDigite seu nome: ");
	gets (str1[count]);
    
	
	printf ("\nDigite seu RG: ");
	gets (str2[count]);
   
    printf ("\nDigite a cidade em que nasceu: ");
	gets (str3[count]);
   
	printf ("\nDigite seu endereco: ");
	gets (str4[count]);

count++;
} while (((strcmp(str1[count-1],FLAG)) && (count <= 5)) && ((strcmp(str2[count-1],FLAG)) && (count <= 5)) && ((strcmp(str3[count-1],FLAG)) && (count <= 5)) && ((strcmp(str4[count-1],FLAG)) && (count <= 5)));

printf ("\n\n\nA matriz dos dados que voce digitou e:\n\n");
totalnums = count-1;
for (count=0; count<totalnums; count++)
printf ("%s\n",str1[count]);
printf ("%s\n",str2[count]);
printf ("%s\n",str3[count]);
printf ("%s\n",str4[count]);

return(0);
}

 

Postado

84047389_Interrogao.png.b7a9a181492934b6f7a318af48fd4866.pngBom Dia @Giovanna Moreira , Tudo Bem! Então... na minha opinião, que não é lá grande coisa, a consequência  de implementar nas bases de Do While é esta 'lapada' de expressão de controle com 1, 2,..., 8 andares. Que não quer dizer que está errado, todavia está grande.

 

 

((strcmp(str1[count-1],FLAG)) 
	&& 
(count <= 5))
	&&
((strcmp(str2[count-1],FLAG))
	&&
(count <= 5))
	&&
((strcmp(str3[count-1],FLAG))
	&&
(count <= 5))
	&&
((strcmp(str4[count-1],FLAG))
	&&
(count <= 5))

 

Há quem diga, e eu concordo, que DO WHILE, WHILE, FOR e GOTO são todos iguais só depende da estilística, e da necessidade de quem usa.

"

 

WHILE é, igual os outros, similar à combinação IF & GOTO e o meu predileto. Acredito que de WHILE vás reduzir bastante essa expressão de controle, suponho que de 8 para 2, pense um pouquinho nessa possibilidade.

((strcmp(str1[count],FLAG)) && (count <= 5))

"

 

  • Obrigado 1
  • Solução
Postado

Da forma que está sua declaração está armazenando espaço para 5 posições. A primeira dimensão é das posições e a segunda a quantidade de caracteres,

 

char str[50][100];

 

Para sair o usuário deve digitar "q", mas se digitar no meio de um cadastro as informações incompletas devem ser exibidas? Uma função para retornar se o cadastro terminou pode facilitar a verificação.

 

#include <stdio.h>
#include <string.h>

int cadastra(const char *txt, char *str){
    printf("%s: ",txt);
    fgets(str,100,stdin);
    return (strlen(str) == 2 && str[0] == 'q');
}

int main(){
    char str1[50][100];
    char str2[50][100];
    char str3[50][100];
    char str4[50][100];
    int i=0,n;

    while(i<50){
        if(cadastra("\nNome",str1[i])) break;
        if(cadastra("RG",str2[i])) break;
        if(cadastra("Cidade",str3[i])) break;
        if(cadastra("Endereco",str4[i])) break;
        i++;
    }
    
    printf("\nCADASTRO:\n\n");
    
    for(n=0;n<i;n++){
        printf("* %s",str1[n]);
        printf("* %s",str2[n]);
        printf("* %s",str3[n]);
        printf("* %s",str4[n]);
        printf("----\n");
    }
    
    return 0;
}

 

  • Obrigado 1
Postado
13 horas atrás, Giovanna Moreira disse:

O programa solicita nome, RG, cidade natal e endereço. Utilizar como estrutura de dados uma matriz de string para cada uma das quatro informações. O programa termina quando o usuário pressiona q.  Ao final do programa deve ser impressa toda a base de dados. Prover espaço de registro para ate 50 pessoas.

 

Tentei dessa forma mas não deu certo, como posso fazer? O raciocínio está errado?

 

 

Sim, está errado em algumas coisas
 

	char str1[5][100];
	char str2[5][100];
	char str3[5][100];
	char str4[5][100];

 

porque não fazer o simples e usar nomes significativos? Algo copiado do texto como
 

	char	nome[50][50];
	char	RG[50][15]; // 234.678.012-4
	char	CidadeNatal[50][50];
	char	Endereco[50][50];

 

Vai ficar associando mentalmente toda vez qual str é a cidade natal?


Isso não existe:
 

		printf("\nDigite seu nome: ");
		gets(str1[count]);

 

gets() não existe mais. Foi declarada oficialmente obsoleta há cerca de 20 anos. Se pretendia ler algo em str1 entenda que str1 é char [5][100], foi assim que você declarou. Se que ler um deles deve dizer qual. De certo modo são 5 linhas de 100 colunas. E esse count seria o que? o limite ou o tamanho que leu? 
 

		printf("\nDigite seu nome: ");
		fgets(nome[0], 50, stdin);
		int count = strlen(nome[0]);

 

Veja acima e compare.  fgets() vai tentar ler da entrada padrão até 50 letras e colocar em nome[0], o primeiro nome. E o tamanho do que foi lido vai estar em count no retorno da função strlen() que devolve... o tamanho da string.

 

E entenda que fgets() lê a linha toda até o ENTER, inclusive o próprio, porque foi pensada para ser usada com puts() para por na tela e assim lê e mostra a mesma coisa.

 

Mas se você vai gravar isso ou usar printf() para por na tela precisa excluir esse '\n' do valor lido

 

Veja a saída do exemplo
 

Digite seu nome: Clube do Hardware
Clube do Hardware

Nome lido: 'Clube do Hardware'

 

E entenda que ele pula uma linha no puts() e isso é prático. Mas nem sempre é o que você quer. E entenda que uma linha em branco não dá pra ver então quando está começando é bom envolver as strings em algo como aspas que eu usei no exemplo...

 

O programa
 

#include <stdio.h>
#include <string.h>
int main(void)
{
	char	nome[50][50];
	char	RG[50][15]; // 234.678.012-4
	char	CidadeNatal[50][50];
	char	Endereco[50][50];

	printf("\nDigite seu nome: ");
	fgets(nome[0], 50, stdin);
	puts(nome[0]);
	nome[0][strlen(nome[0]) - 1] = 0; // apaga o '\n'
	int count = strlen(nome[0]);
	printf("Nome lido: '%s'\n", nome[0]);

	return(0);
}

 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!