Ir ao conteúdo
  • Cadastre-se

C Matriz de string para dados


Giovanna Moreira
Ir à solução Resolvido por Midori,

Posts recomendados

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);
}

 

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

  • Solução

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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...