Ir ao conteúdo
  • Cadastre-se

C Salvar dados de um vetor em outro vetor em C


lets

Posts recomendados

Eu tenho um código onde estou lendo caractere por caractere dentro de um arquivo e salvando eles dentro de um vetor chamado "entrada". Eu estou usando uma vírgula(o caractere 44 da tabela ASCII) como caractere de parada, então eu vou lendo os caracteres do arquivo e armazenando todos no vetor "palavras" enquanto eu não encontrar um vírgula, quando eu encontro a virgula eu paro de ler os caracteres e tenho um if que compara o conteúdo que foi já salvo nesse vetor "entrada" com as palavras que quero encontrar, por exemplo "abacaxi", se a string dentro do meu vetor "entrada" for igual a "abacaxi" ele apresenta um prinft na tela com "Encontrei abacaxi" e limpa o meu vetor, senão ele passa para o próximo if.
 

Eu preciso fazer com que cada vez que a string de caracteres que tenho dentro do meu vetor "entrada" for igual a string de caracteres que estou comparando dentro do meu if eu salve essa string do vetor "entrada" como posição de um novo vetor chamado "vetornovo". Por exemplo: Foram lidos os caracteres do meu arquivo e eles formaram a string "abacaxi", eu comparo essa string dentro do meu if e verifico que ela foi encontrada, aí eu preciso copiar ela do vetor "entrada" como uma nova posição dentro do vetor "vetornovo". Nesse caso deveria ficar: vetornovo[0] = "abacaxi".
 

Esse é o código:

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

int main(){
    int caractere;
    int i=0;
    int v=0;
	char entrada[100] = "";
	char limpa;

    FILE *arquivo;
    arquivo = fopen("arq.txt", "r");

	if (arquivo){
      do
      {
		caractere = fgetc(arquivo);
		if(caractere != 44)  {
			entrada[i++] = caractere;
		}else{
			if(strcmp(entrada, "abacaxi")==0){
				printf("\nEncontrado abacaxi\n", entrada); 
				for(v=0; v<10; v++){
   					entrada[v]=limpa;}
					}else if(strcmp(entrada, "manga")==0){
							printf("\nEncontrada manga\n", entrada); 
							for(v=0; v<10; v++){
   								entrada[v]=limpa;}
							}else if(strcmp(entrada, "laranja")==0){
									printf("\nEncontrada laranja\n", entrada); 
									for(v=0; v<10; v++){
   										entrada[v]=limpa;}
									}else if(strcmp(entrada, "morango")==0){
										printf("\nEncontrado morango\n", entrada); 
										for(v=0; v<10; v++){
   											entrada[v]=limpa;}
										}
			for(v=0; v<10; v++){
	   			entrada[v]=limpa;}
			i=0;
		}	
      }while(!feof(arquivo));	
	}
	system("pause");
}

 

Link para o comentário
Compartilhar em outros sites

Você deveria resolver o problema de pegar a string primeiro antes de tentar comparar com alguma coisa.

Eu fiz esse exemplo de como pegar as strings do arquivo.

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

/* Constantes */
#define T_NOME 30
#define T_STR 20

int main(void)
{
  char nome[T_NOME];
  char str[T_STR];
  FILE *arq;
  printf("\nDigite o nome do arquivo:\t");
  scanf("%[^\n]s%*c",nome);
  /* Abre o arquivo */
  arq=fopen(nome,"r+");
  /* Verifica se o arquivo foi aberto */
  if(arq==NULL)
  {
    perror("\nERRO : Não foi possivel abrir o arquivo.\n");
    exit(EXIT_FAILURE);
  }
  printf("\nNome das frutas.");
  /* Lê o arquivo */
  do
  {
    /* Pega uma string "%s" e dispensa um caractere "%*c" */
    fscanf(arq,"%s%*c",str);   /* Pega a string */
    /*fgets(str,T_STR,arq);     Pega a string */
    printf("\n%s",str);     /* Mostra a string */
  }while(feof(arq)==0);
  fclose(arq);		/* Fecha o arquivo. */
}

Material sobre arquivos Introdução a manipulação de arquivos em C.       

 

Baixe o exemplo para ficar mais fácil de entender LividBonyQueryplan.zip

Link para o comentário
Compartilhar em outros sites

9 horas atrás, arfneto disse:

Seria legal uma descrição do seu problema...

Qual a sua dúvida? O que acontece com o código?

Quero saber uma forma em que posso salvar a string de dentro de um vetor como somente uma posição de um outro vetor.

 

Por exemplo eu tenho o vetor  chamado "entrada" com esses valores:

 

entrada [0] = c 

entrada [1] = a

entrada [2] = s

entrada [0] = a

 

Se eu imprimir todo esse vetor tenho como resultado a string "casa". Preciso saber como posso salvar esse resultado em um outro vetor de forma que toda a string fique apenas em uma posição dele, sem que cada letra fique em uma posição diferente do vetor como ocorre no de entrada. No caso desse exemplo o resultado que quero obter seria esse: novovetor[0] = "casa"

Link para o comentário
Compartilhar em outros sites

1 minuto atrás, lets disse:

novovetor[0] = "casa"

 

Isso está errado. novovetor[0] seria 'c' apenas. novovetor seria "casa".

 

3 minutos atrás, lets disse:

entrada [0] = c 

entrada [1] = a

entrada [2] = s

entrada [0] = a

 

E isso está errado. A notação é

    entrada[2] = 's';

por exemplo.

 

Você precisa ver a declaração das coisas e entender como se escreve. Você tem um livro-texto? Qual é? Tem uma apostila? Um site que você segue para ver as definições?

 

(seu) Exemplo:

char entrada[20]; // 20 posições de char

Se você declarou char entrada[20] então terá 20 cidadãos entrada acessados de entrada[0] a entrada[19].
Eles estarão lá na memória em endereços consecutivos. E você pode escrever entrada[12] = '3' ou entrada[12] = 0. Por exemplo.

E você não poderá acessar entrada como unidade, no geral.  Algo como entrada =  "coisa" não funciona.

 

Agora se você declarou entrada assim:

char* entrada; // um endereco onde encontrar um certo numero de char

É outro caso. Você declarou só entrada. E entrada é um endereço. E você espera que a partir desse endereço esteja um cerrto numero de caracteres, seguidos por um 0. O tal NULL. É a tal string.

No momento não se sabe nada sobre o que tem lá. É esperto sempre colocar um valor quando declara e então pode escrever algo como

char* entrada = NULL;
char* v = 0;
char* coisa = "teste";

Tudo isso estaria certo. Quando declarado assim você pode acessar os elementos de entrada pelo índice também. O problema é que precisa saber se tem algo lá. Antes. 

 

O terceiro caso é o trivial: em coisa tem um endereço. Um valor de 4 bytes em geral, como um int. E esse valor aponta para a memória alocada por seu programa para as variáveis. E nesse endereço está um 't'. e depois vem o resto. E depois vem um 0, o tal NULL. Não é você que escolhe o endereço. É o sistema. Se coisa for 1000 lá no endereço 1000 estará o 't' e em 1005 estará um 0 ou '\0' ou NULL

 

Aí vem a dificuldade quando isso não é bem explicado, ou ao menos explicado. coisa tem um endereço, como tem v e entrada no exemplo. E você não tem controle sobre isso. Então se você escrever coisa = coisa + 1 estará tentando gravar em algo desconhecido e seu programa com sorte vai cancelar.

 

E você também não pode alterar o conteúdo de coisa... Nada de 

    coisa[0] = 'T';

ou

coisa = "outro teste";

 

Para usar assim precisa de memória, endereços alocados. Algo assim

 

    char uns_char[40];

aloca de verdade 40 bytes de char e você pode usar de qualquer jeito. 

E então você declara

char* pChar = uns_char;

E aí pChar que você declarou como um ponteiro para char passa a apontar para uns_char, onde você alocou 40 bytes. E assim a conta fecha.


Confuso? Sim.


Espero que entenda. Tenho que parar agora. 

Esse programa abaixo deve ajudar em suas dúvidas

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

int main()
{
    char* entrada = NULL;
    char* v = 0;
    char* coisa = "teste";

    printf("\nEndereco de coisa [%p]\n\n", (void*)&coisa);
    printf("\tValor de coisa [%p]\n", coisa);
    printf("\tNesse endereco comeca a tal string\n");
    printf("\tO conteudo de coisa [%s]\n", coisa);
    printf("\tO endereco do 't' [%p] e o valor de coisa\n", (void*)&coisa[0]);
    printf("\tO valor do 't' de coisa [%d] o codigo de 't'\n", coisa[0]);
    printf("\tO endereco depois do segundo 'e' de \"teste\" em coisa[ %p]\n",
        (1 + &coisa[4]));
    printf("\tE o valor gravado la [%d]\n", *(coisa + 5));
    printf("\tO tal NULL que termina a string...\n");
    // coisa[4] = 'x'; // se tentar rodar isso ja era

    // aqui tem um valor: 4 bytes mas nao e uma string
    char vetorzinho[4] = { 'a', 'z', 'u', 'l' };

    // uns_char alocar memoria. 40 bytes onde
    // eu posso fazer o que eu quiser.
    char uns_char[40]; // ai sim. Tem memoria
    // agora esse pChar vai apontar para essa região
    // e ai eu posso gravar
    char* pChar = uns_char; // agora pChar aponta para essa memoria

    int indice = 0;
    pChar[indice] = vetorzinho[indice]; // o 'a'
    indice += 1;
    pChar[indice] = vetorzinho[indice]; // o 'z'
    indice += 1;
    pChar[indice] = vetorzinho[indice]; // o 'u'
    indice += 1;
    pChar[indice] = vetorzinho[indice]; // o 'l' na posicao 3
    // todos copiados. Mas precisa terminar por 0 para poder ser uma string
    // em C elas sao 'null-terminated': tem um zero no fim.
    indice += 1;
    pChar[indice] = '\0'; // marca o fim
    // e ai você pode usar
    printf("\n\tO conteudo de uns_char [%s]\n", uns_char);
}

Ele mostra


Endereco de coisa [008FF900]

        Valor de coisa [002B7B30]
        Nesse endereco comeca a tal string
        O conteudo de coisa [teste]
        O endereco do 't' [002B7B30] e o valor de coisa
        O valor do 't' de coisa [116] o codigo de 't'
        O endereco depois do segundo 'e' de "teste" em coisa[ 002B7B35]
        E o valor gravado la [0]
        O tal NULL que termina a string...

        O conteudo de uns_char [azul]

 

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