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;
}