Exacto, cuando la cadena es: 'hello, hi'
Este tendra 9 en longitud, y fgets se encargara de ponerle el '\0' al final, para cumplir con el maximo tamaño permitido, evitando caer en crash y si no me equivoco esto es lo que llaman buffer overflows.
Decia 'complejo' para poder obtener una cadena al menos de una forma segura, y de forma dinamica. Esto es debido por que estuve revisando una funcion que forma parte de un codigo que oculta todo estos detalles, expongo:
Anotar que el tipo de dato 'string', esta previamente definido en una libreria aparte como:
Aunque en este ultimo codigo no entiendo la linea:
Por que si buffer comenzo con NULL, al llegar a esta linea como que asignara NULL para temp, y esto a mi entender como que terminaria el programa
Saludos!
Este tendra 9 en longitud, y fgets se encargara de ponerle el '\0' al final, para cumplir con el maximo tamaño permitido, evitando caer en crash y si no me equivoco esto es lo que llaman buffer overflows.
Decia 'complejo' para poder obtener una cadena al menos de una forma segura, y de forma dinamica. Esto es debido por que estuve revisando una funcion que forma parte de un codigo que oculta todo estos detalles, expongo:
Código (c) [Seleccionar]
string GetString(void)
{
// growable buffer for chars
string buffer = NULL;
// capacity of buffer
unsigned int capacity = 0;
// number of chars actually in buffer
unsigned int n = 0;
// character read or EOF
int c;
// iteratively get chars from standard input
while ((c = fgetc(stdin)) != '\n' && c != EOF)
{
// grow buffer if necessary
if (n + 1 > capacity)
{
// determine new capacity: start at 32 then double
if (capacity == 0)
{
capacity = 32;
}
else if (capacity <= (UINT_MAX / 2))
{
capacity *= 2;
}
else
{
free(buffer);
return NULL;
}
// extend buffer's capacity
string temp = realloc(buffer, capacity * sizeof(char));
if (temp == NULL)
{
free(buffer);
return NULL;
}
buffer = temp;
}
// append current character to buffer
buffer[n++] = c;
}
// return NULL if user provided no input
if (n == 0 && c == EOF)
{
return NULL;
}
// minimize buffer
string minimal = malloc((n + 1) * sizeof(char));
strncpy(minimal, buffer, n);
free(buffer);
// terminate string
minimal[n] = '\0';
// return string
return minimal;
}
Anotar que el tipo de dato 'string', esta previamente definido en una libreria aparte como:
Código (c) [Seleccionar]
typedef char* string;
Aunque en este ultimo codigo no entiendo la linea:
Código (c) [Seleccionar]
string temp = realloc(buffer, capacity * sizeof(char));
Por que si buffer comenzo con NULL, al llegar a esta linea como que asignara NULL para temp, y esto a mi entender como que terminaria el programa
Saludos!