Найдите источник ошибки с помощью sscanf.

Я боролся с этим слишком долго.

Допустим, у меня есть этот минимальный код:

test.cxx

#include <iostream>
#include <cstdio>

int main (int argc, char *argv[])
{
const char *text = "1.01 foo";
float value = 0;
char other[8];

int code = sscanf(text, "%f %7s", &value, other);
std::cout << code << " | " << text << " | => | " << value << " | " << other << " | " << std::endl;

return 0;
}

$ g++ test.cxx; ./a.out производит этот вывод, как и ожидалось:

$ 2 | 1.01 foo | => | 1.01 | foo |

Теперь у меня есть эти 5 строк, встроенных в проект с несколькими тысячами строк и множеством включений …

Компиляция, запуск и вывод теперь:

$ 2 | 1.01 foo | => | 1 | .01 |

Какую стратегию я могу использовать, чтобы найти источник этой несоответствия?

РЕДАКТИРОВАТЬ:
export LC_ALL=C (or LC_NUMERIC=C); ./a.out кажется, решил мою проблему

1

Решение

Это может быть вызвано другой локали в вашем тесте и в приложении назначения. Я был в состоянии воспроизвести это на coliru:

используя:

setlocale(LC_ALL, "cs_CZ.utf8");

http://coliru.stacked-crooked.com/a/5a8f2ea7ac330d66

Вы можете найти некоторые решения в этом SO:

sscanf () и локали. Как можно реально разобрать такие вещи, как "3,14"?

[редактировать]

Решение с uselocale, но раз вы пометили этот вопрос на C ++, то почему бы не использовать std :: stringstream и наполнить его правильным языком (см. ссылку на SO выше)

http://coliru.stacked-crooked.com/a/dc0fac7d2533d95c

  const char *text = "1.01 foo";
float value = 0;
char other[8];

// set for testing, sscanf will assume floating point numbers use comma instead of dots
setlocale(LC_ALL, "cs_CZ.utf8");

// Temporarily use C locale (uses dot in floats) on current thread
locale_t locale = newlocale(LC_NUMERIC_MASK, "C", NULL);
locale_t old_locale = uselocale(locale);

int code = sscanf(text, "%f %7s", &value, other);
std::cout << code << " | " << text << " | => | " << value << " | " << other << " | " << std::endl;

// Go back to original locale
uselocale(old_locale);
freelocale(locale);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]