invólucro stdin getline
Eu gostaria de ler uma linha de stdin, excluindo o caractere de nova linha. Eu escrevi a função:
/* 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;
}
Isso parece ineficiente, estou essencialmente lendo na linha duas vezes, uma na getline e uma vez para remover a nova linha final. Esse não parece ser o algoritmo mais eficiente em termos de memória e gostaria de remover a nova linha sem copiar, se isso for possível.
Sou muito novo em C (usei C ++, Java, etc, mas nunca uma linguagem de sistemas sem objetos), então gostaria de aprender todas as coisas de estilo de código que fiz de errado também. Obrigado!
Respostas
Esta função pode ser escrita assim:
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;
}
A getline()função faz tudo o que você precisa. Você simplesmente precisa verificar se há erros e remover o caractere de nova linha)