envoltura de stdin getline
Me gustaría leer una línea de stdin, excluyendo el carácter de nueva línea. He escrito la función:
/* read in a line from stdin, NULL on failure
* does not include trailing newline
*/
char*
readStdinLine() {
char* buffer;
size_t bufsize = 32;
size_t characters;
buffer = (char *) malloc(bufsize * sizeof(char));
if (buffer == NULL)
return NULL;
characters = getline(&buffer, &bufsize, stdin);
buffer[--characters] = '\0';
char* text = (char *) malloc(characters);
for (int i = 0; i < characters + 1; i++) {
text[i] = buffer[i];
}
free(buffer);
return text;
}
Esto parece insuficiente, esencialmente estoy leyendo en la línea dos veces, una en getline y otra para eliminar la nueva línea final. Ese no parece el algoritmo más eficiente en memoria, y me gustaría eliminar la nueva línea sin copiar, si es posible.
Soy muy nuevo en C (he usado C ++, Java, etc., pero nunca un lenguaje de sistemas sin objetos) así que agradecería aprender todas las cosas de estilo de código que también he hecho mal. ¡Gracias!
Respuestas
Esta función se puede escribir así:
char* readStdinLine()
{
char* buffer = NULL;
size_t bufsize = 0;
ssize_t characters = getline(&buffer, &bufsize, stdin);
if (characters == -1) {
free(buffer);
buffer = NULL;
}
else if (buffer[characters-1] == '\n') {
buffer[characters-1] = '\0';
}
return buffer;
}
La getline()función hace todo lo que necesitas. Simplemente necesita verificar si hay errores y eliminar el carácter de nueva línea)