The below test code demonstrates that sscanf fails
to parse the string "" (ie. an empty string inside "") in line2 (fErr=1).
Is this a bug?
Or is there maybe a workaround format string to be used with sscanf ?

/*
sscanf_bug_demo.cpp

sscanf fails scanning the string ""

Compile:
  g++ -g -Wall -Wextra -std=c++11 sscanf_bug_demo.cpp

Run:
  ./a.out

Input lines:
  joe "prj 1" "blah foo"
  jim "" "quantum leap"

Output:
  line1: n=3 : fErr=0 : un="joe" prj="prj 1" desc="blah foo"
  line2: n=1 : fErr=1 : un="jim" prj="" desc=""
*/

#include <cstdio>
// using namespace std;

void sscanf_bug_demo()
  { // sscanf fails scanning the string ""

    // test data:
    // line format: username "prj" "desc"    (the string in "" can be empty)
    const char* line1 = "joe \"prj 1\" \"blah foo\"";
    const char* line2 = "jim \"\" \"quantum leap\"";

    char un[32], prj[16], desc[256];
    int  n;
    bool fErr;

    // parsing via sscanf:

    un[0] = 0, prj[0] = 0, desc[0] = 0;     // clear them before filling
    n = sscanf(line1, "%31[^ ] \"%15[^\"]\" \"%255[^\"]\"", un, prj, desc);
    fErr = n < 3;
    printf("line1: n=%d : fErr=%d : un=\"%s\" prj=\"%s\" desc=\"%s\"\n",
      n, fErr, un, prj, desc);

    un[0] = 0, prj[0] = 0, desc[0] = 0;     // clear them before filling
    n = sscanf(line2, "%31[^ ] \"%15[^\"]\" \"%255[^\"]\"", un, prj, desc);
    fErr = n < 3;
    printf("line2: n=%d : fErr=%d : un=\"%s\" prj=\"%s\" desc=\"%s\"\n",
      n, fErr, un, prj, desc);
  }

int main()
  {
    sscanf_bug_demo();
    return 0;
  }

Reply via email to