web-dev-qa-db-fra.com

Déclaration implicite de «obtient»

Je comprends qu'une "déclaration implicite" signifie généralement que la fonction doit être placée en haut du programme avant de l'appeler ou que je dois déclarer le prototype.
Cependant, gets doit être dans le stdio.h fichiers (que j'ai inclus).
Y a-t-il un moyen de réparer ceci?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char ch, file_name[25];
   FILE *fp;

   printf("Enter the name of file you wish to see\n");
   gets(file_name);
   fp = fopen(file_name,"r"); // read mode
   if( fp == NULL )
   {
      perror("Error while opening the file.\n");
      exit(EXIT_FAILURE);
   }
}
9
Death_by_Ch0colate

Vous avez raison de dire que si vous incluez des en-têtes appropriés, vous ne devriez pas recevoir l'avertissement de déclaration implicite.

Cependant, la fonction gets() a été supprimée de la norme C11. Cela signifie qu'il n'y a plus de prototype pour gets() dans <stdio.h>. gets() utilisée pour être dans <stdio.h>.

La raison de la suppression de gets() est assez bien connue: elle ne peut pas protéger contre le dépassement de tampon. En tant que tel, vous ne devez jamais utiliser gets() et utiliser fgets() à la place et prendre soin de la nouvelle ligne de fin, le cas échéant.

18
P.P.

gets() a été supprimé de la norme C11. Ne l'utilise pas. Voici une alternative simple:

#include <stdio.h>
#include <string.h>

char buf[1024];  // or whatever size fits your needs.

if (fgets(buf, sizeof buf, stdin)) {
    buf[strcspn(buf, "\n")] = '\0';
    // handle the input as you would have from gets
} else {
    // handle end of file
}

Vous pouvez encapsuler ce code dans une fonction et l'utiliser comme remplacement de gets:

char *mygets(char *buf, size_t size) {
    if (buf != NULL && size > 0) {
        if (fgets(buf, size, stdin)) {
            buf[strcspn(buf, "\n")] = '\0';
            return buf;
        }
        *buf = '\0';  /* clear buffer at end of file */
    }
    return NULL;
}

Et utilisez-le dans votre code:

int main(void) {
    char file_name[25];
    FILE *fp;

    printf("Enter the name of file you wish to see\n");
    mygets(file_name, sizeof file_name);
    fp = fopen(file_name, "r"); // read mode
    if (fp == NULL) {
        perror("Error while opening the file.\n");
        exit(EXIT_FAILURE);
    }
}
12
chqrlie