resueltos punteros memoria manejo ejercicios ejemplos dinamicos dinamica cadenas arreglos c string memory-management malloc dynamic

punteros - memoria dinamica en c ejemplos



¿Cómo asignar dinámicamente el espacio de memoria para una cadena y obtener esa cadena del usuario? (8)

A continuación se muestra el código para crear una cadena dinámica:

void main() { char *str, c; int i = 0, j = 1; str = (char*)malloc(sizeof(char)); printf("Enter String : "); while (c != ''/n'') { // read the input from keyboard standard input c = getc(stdin); // re-allocate (resize) memory for character read to be stored str = (char*)realloc(str, j * sizeof(char)); // store read character by making pointer point to c str[i] = c; i++; j++; } str[i] = ''/0''; // at the end append null character to mark end of string printf("/nThe entered string is : %s", str); free(str); // important step the pointer declared must be made free }

Quiero leer la entrada del usuario que usa el programa C. No quiero usar array como,

char names[50];

porque si el usuario le da una cuerda de longitud 10, entonces los espacios restantes se desperdician.

Si utilizo el puntero del personaje como,

char *names;

entonces necesito asignar memoria para eso de tal manera de,

names = (char *)malloc(20 * sizeof(char));

En este caso también, existe la posibilidad de desperdicio de memoria.

Entonces, lo que necesito es asignar dinámicamente la memoria para una cadena que sea exactamente igual a la longitud de la cadena.

Asumamos,

Si la entrada del usuario es "stackoverflow" , la memoria asignada debe ser de 14 (es decir, Length of the string = 13 y 1 espacio adicional para ''/ 0'').

¿Cómo podría lograr esto?


Aquí hay un fragmento que escribí y que realiza la misma funcionalidad.

Este código es similar al escrito por Kunal Wadhwa .

char *dynamicCharString() { char *str, c; int i; str = (char*)malloc(1*sizeof(char)); while(c = getc(stdin),c!=''/n'') { str[i] = c; i++; realloc(str,i*sizeof(char)); } str[i] = ''/0''; return str; }


Este es un enfoque más simple

char *in_str; in_str=(char *)malloc(512000 * sizeof(char)); enter code herescanf("/n%[^/n]",in_str);


Lea un carácter a la vez (usando getc(stdin) ) y realloc crecer la cadena ( realloc ) sobre la realloc .

Aquí hay una función que escribí hace un tiempo. Tenga en cuenta que está destinado solo para la entrada de texto.

char *getln() { char *line = NULL, *tmp = NULL; size_t size = 0, index = 0; int ch = EOF; while (ch) { ch = getc(stdin); /* Check if we need to stop. */ if (ch == EOF || ch == ''/n'') ch = 0; /* Check if we need to expand. */ if (size <= index) { size += CHUNK; tmp = realloc(line, size); if (!tmp) { free(line); line = NULL; break; } line = tmp; } /* Actually store the thing. */ line[index++] = ch; } return line; }


Podría tener una matriz que comience con 10 elementos. Leer entrada carácter por carácter. Si pasa, reasigna otros 5 más. No es el mejor, pero luego puedes liberar el otro espacio más tarde.


Si debe ahorrar memoria, lea char by char y realloc cada vez. El rendimiento morirá, pero ahorrará 10 bytes.

Otra buena compensación es leer en una función (usando una variable local) y luego copiar. Entonces, el gran buffer tendrá función de alcance.


También puede usar una expresión regular, por ejemplo, el siguiente fragmento de código:

char *names scanf("%m[^/n]", &names)

obtendrá la línea completa de stdin, asignando dinámicamente la cantidad de espacio que requiere. Después de eso, por supuesto, tienes que dar names gratis.


char* load_string() { char* string = (char*) malloc(sizeof(char)); *string = ''/0''; int key; int sizer = 2; char sup[2] = {''/0''}; while( (key = getc(stdin)) != ''/n'') { string = realloc(string,sizer * sizeof(char)); sup[0] = (char) key; strcat(string,sup); sizer++ } return string; } int main() { char* str; str = load_string(); return 0; }