paulo1205
(usa Ubuntu)
Enviado em 21/04/2016 - 11:59h
A função
gets não está simplesmente "depreciada": ela foi REMOVIDA da biblioteca padrão do C desde a publicação da última versão do padrão da linguagem, em 2011. A função que o seu professor está exigindo não é nem mesmo suportada por compiladores com menos de cinco anos.
Infelizmente, professores ruins são fatos da vida, e as escolas, por ruindade ou por corporativismo -- afinal o professor, mesmo quando ruim, é antes de tudo um "companheiro" da "categoria" --, não costumam se movimentar no sentido de obrigar esses charlatães a melhorar suas posturas e atualizar seus conhecimentos. Assim sendo, eu sugiro que você obedeça à requisição do seu professor (mesmo sendo meio cretina) e, ao mesmo tempo, avalie se vale a pena comunicar à coordenação do curso a inadequação do conteúdo da matéria e sua desconexão com a realidade (note que eu falo em reclamar do conteúdo, não do professor, para ter mais chances de ser uma queixa que se aproveite).
"Enquanto isso, na Sala da Justiça", você pode experimentar embutir no seu código artifícios que, ao mesmo tempo, permitam-lhe satisfazer a exigência do professor e a dos compiladores modernos, ao mesmo tempo em que emite discretamente o aviso de que você sabe que está sendo obrigado a fazer besteira (mas note que, dependendo do grau de recalque do professor, até isso pode ser perigoso).
EDIT:
// Alternativa 1: criar uma versão alternativa e privativa de gets(),
// copiando inclusive os bugs da gets() original.
/* Modo de contornar reclamação sobre gets() em alguns sistemas (e.g. Ubuntu Linux). */
static char *my_gets(char *bogus){
int c; // int, não char!
int n=0;
while((c=getchar())!=EOF && c!='\n')
bogus[n++]=c;
bogus[n]='\0';
return n==0 && c==EOF? NULL: bogus;
}
#define gets(x) my_gets(x)
// Alternativa 2: Se você garantir que sempre vi chamar gets() com arrays
// de char, e nunca com ponteiros. Com esta versão, não se permite a
// leitura de mais caracteres do que o tamanho do array, o que a faz
// funcionalmente diferente da gets() original.
/*
Modo de contornar reclamação sobre gets() em alguns sistemas (e.g. Ubuntu Linux).
A implementação evita o buffer overrun da gets() original, interrompendo a leitura
antes do fim de linha, se necessário.
*/
static char *my_gets(char *str, size_t strsize){
int c; // int, não char!
int n=0;
if(strsize==0)
return NULL;
--strsize;
while(n<strsize && (c=getchar())!=EOF && c!='\n')
str[n++]=c;
str[n]='\0';
return n==0 && c==EOF? NULL: str;
}
#define gets(x) my_gets(x, sizeof x/sizeof x[0])
// Alternativa 3: Semelhante à anterior, mas aceita argumento ponteiro também.
// Há, porém, dois problemas:
// 1) quando o argumento é ponteiro, não dá para inferir automaticamente o tamanho
// da área apontada, e por isso a função vira gets(), com possibilidade de overrun;
// 2) como a detecção do ponteiro é feita com base no tamanho do argumento, um array
// com nº de elementos igual ao tamanho de um ponteiro é interpretado como se fosse
// ponteiro, logo sujeito a overrun também.
/*
Modo de contornar reclamação sobre gets() em alguns sistemas (e.g. Ubuntu Linux).
A implementação tenta, se possível, evitar o buffer overrun da gets() original, inter-
rompendo a leitura antes do fim de linha, se necessário.
*/
static char *my_gets(char *str, size_t strsize){
int c; // int, não char!
int n=0;
if(strsize==0)
return NULL;
--strsize;
while(n<strsize && (c=getchar())!=EOF && c!='\n')
str[n++]=c;
str[n]='\0';
return n==0 && c==EOF? NULL: str;
}
#define gets(x) my_gets((x), sizeof (x)!=sizeof(char *)? sizeof (x)/sizeof (x)[0]: INT_MAX)
// Alternativa 4: em C++.
// Função polimórfica com array passado por referência (invocada
// se o argumento da macro, abaixo, for um array).
template <size_t strsize> char *my_gets(char (&str)[strsize]){
cin.getline(str, strsize);
return cin.failbit()? nullptr: str;
}
// Função polimórfica com ponteiro passado por referência (invocada
// se o argumento da macro, abaixo, não for um array).
char *my_gets(char *const &ptr){
cin.getline(ptr, numeric_limits<streamsize>::max());
return cin.failbit()? nullptr: ptr;
}
#define gets(x) my_gets(x)
Por fim, há, sim, como fazer o Ubuntu aceitar o uso de
gets (). Se você usa o GCC, na hora de compilar, você pode dizer que quer usar o padrão ISO do C de 1990 (“
-std=c90 ” (ou “
-std=gnu90 ”, se pretender usar extensões exclusivas da GNU além do padrão de 1990). Pode também usar
c99 /
gnu99 para o padrão de 1999, mas aí já vai receber avisos de que
gets () é obsoleta. Você pode ignorar tais avisos, ou pode desabilitá-los, por meio da opção “
-Wno-deprecated-declaration ”.
Já a mensagem de aviso que vem do linker é mais difícil de desabilitar. Se você não quiser simplesmente ignorá-la, pode seguir a sugestão dada em
http://stackoverflow.com/questions/3409448/how-do-you-suppress-gcc-linker-warnings .