C/Visual C - arreglo dinamico de char *

 
Vista:
sin imagen de perfil

arreglo dinamico de char *

Publicado por Diego (150 intervenciones) el 01/10/2016 04:23:59
Buenas noches traté de adaptar el código que tenía para un arreglo dinámico de uint64_t
Quise hacer que funcionara para hacer un arreglo dinámico de cadenas de caracteres, pero no funcionó mi adaptación.

Arreglo de uint64_t:
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <endian.h>
#include <inttypes.h>
void add_number(uint64_t **array, uint64_t number, uint64_t size);
int main(int argc, char *argv[]){
	uint64_t num;
	uint64_t *array = NULL;
	uint64_t i;
	for (i = 0; i<4; i++){
		scanf("%" SCNu64, &num);
		add_number(&array, num, i);
	}
	for (i = 0; i<4	; i++){
		printf("num = %" PRId64 "\n", *(array + i));
	}
	return EXIT_SUCCESS;
}
void add_number(uint64_t **array, uint64_t num, uint64_t size) {
	*array = (uint64_t *)realloc(*array, (size + 1) * sizeof(uint64_t));
 
	(*array)[size] = num;
 
//	printf("num = %" PRId64 "\n", (*array)[size]);
}


Intento de arreglo de char *:
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <endian.h>
#include <inttypes.h>
void add_line(char ***array, char *line, uint64_t size);
int main(int argc, char *argv[]){
	char *line1, *line2, *line3 = NULL;
	char **array = NULL;
	uint64_t i;
//	array = (uint64_t *)malloc(sizeof(uint64_t) * 1);
	line1 = (char *) malloc(sizeof(char) * 2);
	*(line1 + 1) = '\0';
	strcpy(line1, "A");
	line2 = (char *) malloc(sizeof(char) * 2);
	*(line2 + 1) = '\0';
	strcpy(line2, "B");
	line3 = (char *) malloc(sizeof(char) * 2);
	*(line3 + 1) = '\0';
	strcpy(line3, "C");
	add_line(&array, line1, i);
	add_line(&array, line2, i);
	add_line(&array, line3, i);
	}
/*	for (i = 0; i<4	; i++){
		printf("num = %" PRId64 "\n", *(array + i));
	}*/
	free(array);
	return EXIT_SUCCESS;
}
void add_line(char ***array, char *line, uint64_t size) {
	*array = (char *)realloc(*array, (size + 1) * sizeof(char));
	(*array)[size] = line;
//	printf("num = %" PRId64 "\n", (*array)[size]);
}
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

arreglo dinamico de char *

Publicado por Chema (234 intervenciones) el 01/10/2016 12:51:22
¿Qué es un arreglo?.

Un arreglo en toda regla es lo que necesita la técnica que exhibes.

¿Qué pretendes hacer con ese código?, ¿magia? .
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

arreglo dinamico de char *

Publicado por Diego (150 intervenciones) el 01/10/2016 18:23:54
Tengo que almacenar N cantidad de nombres de distinta longitud y luego ordenarlos en forma ascendente y descendente.
Y como no se cuantos nombres voy a recibir no puede reservar la cantidad de memoria necesaria con Malloc.

Ahora quité errores y ya compila sin errores, pero vuelvo a tener violación de acceso. Se produce al intentar usar realloc.

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <endian.h>
#include <inttypes.h>
void add_line(char ***array, char *line, uint64_t size);
int main(int argc, char *argv[]){
	char *line1, *line2, *line3 = NULL;
	char **array = NULL;
	uint64_t size = 0;
	line1 = (char *) malloc(sizeof(char) * 2);
	*(line1 + 1) = '\0';
	strcpy(line1, "A");
	line2 = (char *) malloc(sizeof(char) * 2);
	*(line2 + 1) = '\0';
	strcpy(line2, "B");
	line3 = (char *) malloc(sizeof(char) * 2);
	*(line3 + 1) = '\0';
	strcpy(line3, "C");
	add_line(&array, line1, size);
	printf("pass\n");
	++size;
	add_line(&array, line2, size);
	++size;
	add_line(&array, line3, size);
	return EXIT_SUCCESS;
}
void add_line(char ***array, char *line, uint64_t size) {
	**array = (char *)realloc(**array, (size + 1) * sizeof(char));
	(**array)[size] = *line;
	printf("%s", (*array)[size]);
}
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

arreglo dinamico de char *

Publicado por Diego (150 intervenciones) el 01/10/2016 20:57:58
Ya encontré una forma de implementar lo que estoy buscando.
Borré todo y comencé devuelta un nuevo código de prueba.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <endian.h>
#include <inttypes.h>
void agregar_elemento(char *** array, char *elemen, int size);
int main(int argc, char *argv[]){
	char **array = NULL;
	char *line1 = malloc(sizeof(char) * 4), *line2 = malloc(sizeof(char) * 5);
	strcpy(line1, "EVA");
	line1[3] = '\0';
	strcpy(line2, "ADAN");
	line2[4] = '\0';
	agregar_elemento(&array, line1, 0);
	agregar_elemento(&array, line2, 1);
	return EXIT_SUCCESS;
}
void agregar_elemento(char *** array, char *element, int size)
{
	*array = realloc(*array, sizeof(char *) * (size + 1));
	*(*(array + size)) = element;
	printf("%s\n", *(*(array + size)));
}

Ahora ya puedo desarrollar la función que pretendo hacer.
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