Die Statistik ist für den Politiker das, was für den Betrunkenen die Laterne ist.
Sie dient weniger der Erleuchtung als der Aufrechterhaltung des eigenen Standpunktes.
(Roland Koch)

External Content not shown. Further Information.

So I wrote a simple wavefront parser using POSIX regular expressions. It suddenly stopped working, while I was trying to port the whole thing to Qt. The parser itself is not very beautiful, but it did its job well so far, so why change it?

Well, I found out the problem lies in the following line:

sscanf(mytokens[1+i], "%lf", coords+i);

The variable mytokens[1+i] contains a string that contains a float, say, -0.697203. coords is an array of float values. However, suddenly, it always contained zero. I added the following line to debug this issue:

fprintf(stderr, "%s %lf\n", mytokens[1+i], coords+i);

The output consisted of lines of the form

-0.212040 0,000000
1.092960 0,000000
-0.679962 0,000000
-0.110031 0,000000
1.123250 0,000000

I noticed that the second numbers all have a comma as separator - which is common in Germany. And my locale is set to de_DE.UTF-8. And sscanf seems to also parse according to this locale.

Running my application with LANG=C worked again.

Update:

Maybe I should have given the solution to the problem. Well, the locale is set by Qt apparently. I could set it using setlocale(3), but then I would risk clashes with other parts of Qt.

Instead, as I use C++ anyway, I used a std::stringstream, and its method imbue. A quick and dirty replacement for sscanf looked like

static void parse_double (const string& dbl, double& ret) {
    locale l("C");
    stringstream ss;
    ss.imbue(l);
    ss << dbl;
    ss >> ret;
}