Я потратил весь день на отладку случайной ошибки, когда наконец понял, что проблема в том, что sscanf вызывается из нескольких потоков.
Я подтвердил, выполнив следующий код, который работает, как и ожидалось, на Snow Leopard, но выдаеточень странные результаты на моем iphone с ОС 3.1.2.Он также отлично работает в симуляторе.
На iPhone разобранный номер будет несколько случайной комбинацией цифр, используемых в строках.
Было бы очень полезно, если бы кто-нибудь мог проверить,это общая проблема, или если это ошибка с моей стороны.
- (void)testIt
{
[NSThread detachNewThreadSelector:@selector(scanfTest) toTarget:self withObject:nil];
[NSThread detachNewThreadSelector:@selector(scanfTest) toTarget:self withObject:nil];
}
- (void)scanfTest
{
while (true)
{
float value = 0.0f;
sscanf("456", "%f", &value);
sscanf( "1.63", "%f", &value);
if (value != 1.63f)
NSLog(@"strange value is %f", value);
}
}
Я провел дополнительную проверку, и оказалось, что только числа с плавающей запятой являются проблемой.
Этот код работает
- (void)scanfTest4
{
while (true)
{
int year = 0;
int month = 0;
int day = 0;
sscanf("20090131", "%4d%2d%2d", &year, &month, &day);
sscanf("19840715", "%4d%2d%2d", &year, &month, &day);
if (year != 1984 || month != 7 || day != 15)
NSLog(@"bla");
}
}
И этот код не работает с теми же случайными цифрами
- (void)scanfTest4
{
while (true)
{
int year = 0;
int month = 0;
float day = 0.0f;
sscanf("20090131", "%4d%2d%2f", &year, &month, &day);
sscanf("19840715", "%4d%2d%2f", &year, &month, &day);
if (year != 1984 || month != 7 || day != 15.0f)
NSLog(@"bla");
}
}