The man page for sscanf on my machine indicates that [ "matches a
nonempty sequence of characters", so failing to match an empty
character sequence seems to be correct behavior.

On Mon, Jul 15, 2024 at 10:16 PM U.Mutlu <u...@mutluit.com> wrote:
>
> 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