C/Visual C - string dinamico

 
Vista:
sin imagen de perfil

string dinamico

Publicado por Diego (150 intervenciones) el 10/06/2016 21:58:21
BUenas tardes, conseguí un examen de un seminario de C, pero no logro ver bien como declarar algunos miebros de la estructura.

ejercicio:
1) Crear la lista ordenada lista_de_canciones_t con las operaciones correspondientes (crear, insertar,
borrar_elemento, borrar_lista), las canciones tienen:
Nombre del tema (string de longitud desconocida)
Nombre del artista (string de longitud desconocida)
Número de Pista (int)
Path al archivo (string de longitud desconocida)

La lista deberá estar ordenada por número de pista (de menor a mayor).

2) Escribir una función main() que cargue la lista con al menos 5 entradas desordenadas y luego
imprima el contenido de la lista.

Observación: Al menos debe insertar de forma ordenada de forma correcta para aprobar.

Fin ejercicio;

me cuesta ver bien como declarar un string de longitud desconocida; crei que sería algo así como hacer un string de longitud variable(cosa que intento hacer, pero con poco exito)

Mi interes está centrado en como representar el string de longitud desconocida, Ya que una vez definido ese tipo de dato, ya puedo trabajar normalmente como en una lista cualquiera. Si alguien puede orientarme se lo agradecería.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

string dinamico

Publicado por Chema (234 intervenciones) el 11/06/2016 01:11:30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct NoLoSe{
       char  *numerodelaloteria;
       char  *preguntaexmen;
       char *quehareemdia4;
        struct NoLoSe *siguientecosa;
}
 
void AhoraLose(char *cosaquehacer){
        cosaquehacer = Malloc(numerodeveces);
}
 
main(void){
    sino lo se, no lo se, pero si lo se , AhoraLose(cosaquehacer)
 
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

string dinamico

Publicado por Diego (150 intervenciones) el 11/06/2016 02:23:22
Se me había ocurrido, hacer un malloc(sizeof(char)* (length(gets(cadena)))+1); O hacer un realloc caracter a caracter hasta llegar al salto de linea o EOF. Todavía sigo probando haber como lo hago.

Sigo probando codigos, y luego escribo como me fue.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

string dinamico

Publicado por Diego (150 intervenciones) el 11/06/2016 04:27:31
intenté hacer que la cadena vaya creciendo de a un caracter. Pero luego de varias correcciones seguia tienendo el problema: double free or corruption. Hasta que después de leer más supe que realloc no solo reasigna sino que libera el espacio asignado de malloc o calloc;

Ahora el codigo no me genera una doble liberación de memoria, pero ahora quedo en un loop infinito. y en ente momento no veo bien cual puede ser el problema.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
	char *cadena = NULL;
	char *cadena_tmp = NULL;
	int caracter, tamanio, resul;
	tamanio = 1;
	cadena_tmp = (char *)malloc(sizeof(char)* 1);
	resul = scanf("%d", &caracter);
	while (resul != EOF){
		*(cadena_tmp + tamanio - 1) = (char)caracter;
		++tamanio;
		cadena = (char *)realloc(cadena_tmp, tamanio);
		//free(cadena_tmp);
		cadena_tmp = cadena;
		resul = scanf("%d", &caracter);
	}
	*(cadena + tamanio) = '\0';
	printf("cadena resultante:--%s--", cadena);
	putchar('\n');
	return 0;
}

Trato de ingresar Ctrl + D pero no pareciera tomarmelo.
Como no salgo del loop infinito no puedo comprobar si mi intento de string variable funciona.

PD: uso linux ubuntu x64.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

string dinamico

Publicado por Chema (234 intervenciones) el 11/06/2016 13:32:30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
typedef struct String{
	int bufsize;
	int currsize;
	char *buf;
}String;
 
 
String *NewString(int size){
	 String *str;
	 str = malloc(sizeof(String));
	 str->buf = malloc(size);
	 str->currsize = 0;
	 str->bufsize = size;
 
	 return str;
}
 
char *BlaBlaBla [] = {
	"hola, ", "el LINUX " , "ese que usas\n", "es maligno.\n",
	"produce crecimiento ", "del conocimiento\n", "y engrandece "
	"la inteligencia.\n", "y eso, ", "produce ", "dolores de cabeza\n",
	0X0
};
 
int Inserdata(String *str,char *data, int len){
 
	if (len == 0)
		len = strlen(data);
 
	if (len <  (str->bufsize - str->currsize ) ){
		memcpy(str->buf + str->currsize,data, len);
		str->currsize += len;
		 *(str->buf + str->currsize) = 0x0;
	}else {
		/*
		*falta implementar realloc , no tengo ganas de terminar el ejemplo.
		*/
		len = 0;
	}
 
	return len;
}
 
int main(void){
	String *str;
	char **ptr;
 
	str = NewString(1024);
	ptr = BlaBlaBla;
 
	while(*ptr){
		Inserdata(str,*ptr,0);
		ptr++;
	}
 
	printf("%s", str->buf);
 
	free(str->buf);
	free(str);
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

string dinamico

Publicado por Chema (234 intervenciones) el 11/06/2016 19:57:47
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
typedef struct Sre{
	char *start;
	char *raw;
	char *end;
}Sre;
 
#define BUFSIZE 8192
 
int InserData(Sre *sre, char *ptr, int len ){
	int size;
 
	if (len == 0)
		len = strlen(ptr);
 
	size = sre->end - sre->raw ;
 
	if (len > size){
		/*realloc*/
	}else {
		while(len--)
			*sre ->raw++ = *ptr++;
		*sre ->raw = 0x0;
	}
 
	return 0;
}
 
int main(void){
	Sre *sre;
	char **ptr;
	char *buf;
 
	sre = malloc(sizeof(Sre));
	ptr = BlaBlaBla;
	buf = malloc(BUFSIZE);
	sre ->raw = sre ->start = buf;
	sre ->end = buf + BUFSIZE;
 
	while(*ptr){
		InserData(sre,*ptr,0);
		ptr++;
	}
 
	printf("%s", buf);
	free(sre);
	free(buf);
 
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

string dinamico

Publicado por Chema (234 intervenciones) el 11/06/2016 20:22:32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
char *BlaBlaBla [] = {
	"hola, ", "el LINUX " , "ese que usas\n", "es maligno.\n",
	"produce crecimiento ", "del conocimiento\n", "y engrandece "
	"la inteligencia.\n", "y eso, ", "produce ", "dolores de cabeza\n",
	0X0
};
 
 
 
#define BUFSIZE 8192
 
int main(void){
 
	char **ptr;
	char *buf;
	char *raw;
	char *end;
	int len = 0;
 
	ptr = BlaBlaBla;
 
	buf = malloc(BUFSIZE);
	end = buf + BUFSIZE;
	raw = buf;
 
	while(*ptr){
		len = strlen(*ptr);
 
		if ( len > ( end -raw)  ){
			/*realloc*/
		}else{
			while(len--){
				*raw++ = *(*ptr)++;
			}
		}
		ptr++;
	}
 
	printf("%s", buf);
 
	free(buf);
 
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

string dinamico

Publicado por Diego (150 intervenciones) el 12/06/2016 13:40:21
Gracias, Está bueno el codigo, me divirtió la cadena BlaBlaBla.

Ahora que ya se como declarar el miembro de longitid desconocida puedo empezar a trabajar en las operaciones de la lista.

Cualquier problema, vuelvo a plantearlo en el foro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar