9
votes

Entrée de chaîne dynamique - à l'aide de Scanf ("% comme")

J'essaie de lire l'entrée en utilisant scanf code> et de stocker dans char * code> Dynamiquement comme spécifié par GCC Manual , mais il donne une erreur de temps de compilation.

  char *string;
  if (scanf ("%as",&string) != 1){
    //some code
  }
  else{
   printf("%s\n", *string);
   free(string);
   //some code
  }


0 commentaires

4 Réponses :


0
votes

J'ai eu une expérience limitée avec GCC, mais je n'ai jamais vu de modificateur pour scanf . Avez-vous essayé de remplacer le % A avec % s dans la troisième ligne que vous avez fournie?


4 commentaires

Veuillez vous référer au lien fourni. FYI% C stocke seulement 1 char. J'essaie d'allouer de manière dynamique la mémoire pour stocker une chaîne complète de caractères 0-9A-ZA-Z.


Je sais ce que % c fait - je viens de manquer ce bit. Que se passe-t-il lorsque vous utilisez % s au lieu de % A ?


% S fonctionnera si vous avez déjà alloué la mémoire. tandis que% comme (avec un drapeau) alloue la mémoire requise à * variable pouvant être libérée ultérieurement ()


@nvl - que je ne savais pas. Merci pour l'info :)



1
votes

Avez-vous des extensions GNU activées? Standard C n'a pas de a modificateur.


0 commentaires

0
votes

'Entrée de chaîne dynamique' avec scanf ("% comme") fonctionnera si le -ansi ou -std = c89 drapeau est Activé.
Compiler en utilisant GCC -ansi

ou sinon vous pouvez utiliser scanf ("% ms")


0 commentaires

10
votes

Le modificateur A sur scanf ne fonctionnera pas si vous compilez avec le -std = c99 drapeau; Assurez-vous que vous n'utilisez pas cela.

Si vous avez au moins la version 2.7 de GLIBC, vous pouvez et devez utiliser le modificateur m à la place de A .

En outre, il est de votre responsabilité de libérer le tampon.


4 commentaires

Compiler avec '-ansi' ou '--STD = C98' fonctionne avec Scanf ("% comme").


Quelques fond sur le drapeau M , puisque les documents GCC / Glibc ne le mentionnent pas: gcc.gnu.org/ml/gcc-patches/2007-09/msg01342.html


Pour utiliser le modificateur A , PASS -D_GNU_SOURCE à GCC, mais bien sûr, utilisez mieux M .


Confusion, avec _gnu_source défini (dans le fichier .c avant tout #include s), GCC 4.9.2 avec -std = gnu99 avertit que % A veut un float * , mais vous y passez un char ** . Mais le comportement correspond à % m [. Il m'a fallu un moment pour vous rappeler que % A était une conversion dynamique de l'allocation, car la page de l'homme ne mentionne pas l'ancien sens de GNU qui se trouve n'importe où près des autres modificateurs. Même le nouveau POSIX.1-2008 % ms / % m [ seulement est mentionné dans un paragraphe dense avec la largeur de champ. Vraiment facile à manquer. : /