Skip to content

Instantly share code, notes, and snippets.

@ravishi
Created July 30, 2011 18:44
Show Gist options
  • Save ravishi/1115844 to your computer and use it in GitHub Desktop.
Save ravishi/1115844 to your computer and use it in GitHub Desktop.
lê a entrada padrão até encontrar um newline
/**
* Versões:
* ... um bocado de versões bugadas ou incompletas
* 1. uma versão "funcional"
* 2. removidas as chamadas a fflush(stdin), que eram inúteis, como é explicado dado aqui [1]
*
* [1] http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1052863818&id=1043284351
*/
#include <stdio.h>
#include <stdlib.h>
/* lê coisas da entrada padrão até encontrar um newline.
* retorna a string lida (sem o newline no final) em caso de sucesso
* ou NULL caso algum erro aconteça. o tamanho inicial do buffer será ignorado
* se for menor que 1 */
char * input(int initial_buf_size)
{
char c, *cur, *buffer;
int current_buf_size;
if (initial_buf_size < 1) {
initial_buf_size = 1;
}
cur = buffer = malloc(sizeof(char) * initial_buf_size);
current_buf_size = initial_buf_size;
while (buffer != NULL) {
/* ler o próximo caractere */
*cur = fgetc(stdin);
if (ferror(stdin)) {
/* erro */
free(buffer);
return NULL;
} else if (*cur == '\n' || *cur == '\0' || *cur == EOF) {
/* fim da linha encontrado */
*cur = '\0';
return buffer;
}
/* garantir que há espaço suficiente no buffer para mais um caractere
*/
if (current_buf_size < cur - buffer + 1) {
current_buf_size *= 2;
buffer = realloc(buffer, sizeof(char) * current_buf_size);
}
/* continuar lendo... */
cur++;
}
return NULL;
}
void main()
{
while (1) {
char *str;
printf("Escreva alguma coisa:\n");
str = input(1);
if (str == NULL) {
printf("Erro\n");
} else if (strcmp(str, "") != 0) {
printf("Você escreveu: %s\n", str);
} else {
printf("\n\nFalou!\n");
break;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment