021023 – sscanf ne peut pas lire une chaîne de longueur nulle

la programmation


Le code suivant :

C
#include <stdio.h>

int main(void) {
  char buf[80] = "salam";
  const char *fmt = "\"%79[^\"]\"";
  int n;

  n = sscanf("\"\"", fmt, buf);
  printf("%d fields were read. buf = '%s'\n", n, buf);
  n = sscanf("\"hamidi\"", fmt, buf);
  printf("%d fields were read. buf = '%s'\n", n, buf);
}

les sorties:

0 champs ont été lus. buf=”salam”
1 champs ont été lus. buf=”hamidi”

Cela indique que la fonction sscanf ne peut pas lire les chaînes vides avec la chaîne de format spécifiée. Existe-t-il un bon remplacement pour la chaîne au format regex pour lire les chaînes d’une longueur ZÉRO jusqu’à 79 caractères au maximum par la fonction sscanf ? En d’autres termes, je m’attends à ce que le premier sscanf insère ‘\0’ à buf[0] et renvoie 1 au lieu de 0. Existe-t-il un moyen ?

Ce que j’ai essayé :

C’est juste une question. Ce n’est pas quelque chose que je dois essayer.

Solution 1

Une meilleure option serait d’utiliser fgets[^]. Il inclut le caractère de nouvelle ligne qui est lu mais qui peut être facilement supprimé avec une fonction comme celle-ci :

C
void StripChar( char * buffer, int chr )
{
    char * p = strchr( buffer, chr );
    if( p )
       * p = 0;
}

Voici un petit échantillon :

C
#define BUFFER_SIZE 79
    char buffer[ BUFFER_SIZE + 1 ] = { 0 };
    fgets( buffer, BUFFER_SIZE, stdin );
    StripChar( buffer, '\n' );

コメント

タイトルとURLをコピーしました