Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Shouji_tko

String tamanho variavel

Recommended Posts

Entao estou precisando de uma ajuda .preciso salvar em arquivo dados de tamanho variavel pegados na entrada.( usuario e senha )queria saber como faço isso ja que nao posso declarar vetores de nenhum tamanho e tb nao posso usar lista ligada.Muito obrigado pra quem puder me dar uma ajudinha

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo tudo bem?Quando declaramos um vetor de string normalmente colocamos um tamanho, mais este procedimento na verdade é abstrato, pois podemos 'estourar' o tamanho do vetor.. Por exemplo:

char *a; a[50]='R'; a[51]='F'; printf("%c",a[50]); printf("%c",a[51]);

Declarando char *a eu estou dizendo ao SO que não sei o tamhno da string.. então pode ser qualquer tamhno..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá

Declarando char *a eu estou dizendo ao SO que não sei o tamhno da string.. então pode ser qualquer tamhno...

Colega, se fizer isto como foi mencionado acima, você terá varios problemas em seu programa como "core dump" ou "GPF", ou até mesmo que o seu programa continue rodando e "melando" areas de memória.Quando você declara "char * a" o compilador vai entender que a variável "a" é um ponteiro para uma área de memória, ou seja, a variável "a" armazenará o endereço da posição de memória. Como qualquer variável local em linguagem C/C++, o seu conteúdo não é inicializado automaticamente, portanto o endereço apontado por "a" poderá ser qualquer posição de memória da máquina. Ao executar a operação a[50] = 'R', você estará causando um "core dump" ou "GPF", ou até mesmo "melando" outras áreas do seu próprio programa.Se você for trabalhar com ponteiros, você deve inicializa-los com um endereço válido já existente em seu programa, ou solictar ao SO a alocação de uma área. A biblioteca da linguagem C contém funções que solicitam ao SO a alocação e liberação de memória previamente alocada. As funções mais usadas são: malloc() e realloc(), para alocação e realocação de memória; free() para a liberação da área alocada. Sugiro que você estude sobre ponteiros e principalmente estas funções que citei para implementar strings de tamanho variável.Espero ter ajudado em alguma coisaBoa sorte!elsd

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu arrumei o programa , ele só tava rodando no windows , no linux ele dava segmentation fault.eu fiz ele alocando dinamincamente a memoria e mantendo um contador , quando chegava no tamanho limite ele dava um realloc , fico bem simples e util

Compartilhar este post


Link para o post
Compartilhar em outros sites

ta ae o resultado

 

typedef TAM_MAX 100typedef char * String;String le_stream( FILE *arq ){	String nome;		char ch,	//recebera o caracter do arquivo		 ch_res;//Variavel para caso quando se estoura o tamanho da string	int i = 0,  //variavel que conta quantos caractes foram recebidos, se chega a TAM_MAX-1 , a string esta em seu tamanho maximo		j = 0,  //int auxiliar que aumenta em TAM_MAX quando i chega ao seu limite		k = 2;  //variavel que controlara o quanto de memoria sera realcada, tem valor 2 por que o primeiro realocamento dobra o tamanho da string	ch = getc(arq);	//Retorna NULL para quando chega ao fim do arquivo	if( feof(arq)){		return NULL;	} 	nome = (String)malloc(sizeof(char)*TAM_MAX);	//Pega caracteres ate receber \	while ( ch != 0 ){		*(nome + i + j) = ch;		i++;		ch = getc(arq);		//Acoes para quando ocorre estouro do tamanho da string.				if ( i == TAM_MAX - 1){			ch_res = getc(arq);			//Se o proximo caracter for o \n quer dizer q a string iria acabar.			if ( ch_res == '\'){				break;			//Se nao era, ocorre realocamento da memoria			}else{				*(nome + i + j) = ch_res;				nome = realloc(nome, TAM_MAX*k);				i = 0;				j+=TAM_MAX;				k++;			}		}	}	//adiciona o caracter  no fim da string	*(nome + i + j) = '\'; 	return nome;}

lugar q tem uma barra sozinha era pra ter um 0 em seguida

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro colega, posso sugerir uma forma mais simples e rápida.

 

#include <stdio.h>#include <string.h>#define TAM_MAX 100typedef char* String;String LeStream( FILE* fp ){		String str;		String ptr;		char bf[ TAM_MAX + 1 ];		int t;		t = 0;		str = ( char* )( malloc( sizeof( char ) ) );		*str = 0;		memset( bf, 0, sizeof( bf ) );		fread( bf, sizeof( char ), TAM_MAX, fp );		while( !feof( fp ) )		{				ptr = strchr( bf, '\\' );				if( ptr ) *ptr = 0;				t += strlen( bf ) + 1;				str = ( String )( realloc( str, sizeof( char ) * t ) );				strcat( str, bf );				if( ptr ) break;				memset( bf, 0, sizeof( bf ) );				fread( bf, sizeof( char ), TAM_MAX, fp );		}		return( str );}

Não esqueça de chamar a função free() após o usar a variável retornada.

 

Boa sorte!

elsd

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que quando declaramos um char *sA cada gets que damos no programa o SO faz um malloc para guardar a informação.. e neste caso não tera problema de invasão na memoria.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que quando declaramos um char *sA cada gets que damos no programa o SO faz um malloc para guardar a informação.. e neste caso não tera problema de invasão na memoria.

Desde quando?????Isto nunca aconteceu, se você ler a especificação da linguagem verá que isto não é verdade.Segue a indicação de um bom livro: C Completo e Total de Herbert Schildt da Makron Books.Boa Sorte!elsd

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal,Andei pesquisando sobre o assunto, perguntei ao meu professor e ele disse o seguinte:Quando declaramos char *s estamos dizendo ao So que não sabemos o tqamanho da String, e quando usamos qualquer função de leitura de dados como o gets ou como o scanf, o SO tem controle de onde está alocando os dados..O que não podemos fazer é declarar um char s[10] e depois alocar algum dado em s[11] pois esta posição de memória não estava prevista..e ai sim vamos invadir outra parte da memoria usada por outros programas..valeu...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.