wrapper getline stdin
Vorrei leggere una riga da stdin, escluso il carattere di nuova riga. Ho scritto la funzione:
/* 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;
}
Questo sembra inefficace, essenzialmente sto leggendo nella riga due volte, una volta in getline e una volta per rimuovere la nuova riga finale. Questo non sembra l'algoritmo più efficiente in termini di memoria e vorrei rimuovere la nuova riga senza copiare, se possibile.
Sono molto nuovo in C (ho usato C ++, Java, ecc., Ma mai un linguaggio di sistema senza oggetti), quindi apprezzerei anche imparare tutte le cose in stile codice che ho sbagliato. Grazie!
Risposte
Questa funzione può essere scritta in questo modo:
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()funzione fa tutto ciò di cui hai bisogno. Devi semplicemente verificare la presenza di errori e rimuovere il nuovo carattere di riga)