Есть несколько способов достичь того, что вы хотите. Поскольку вы говорите о динамических массивах, очевидной вещью, которую вы должны сделать, было бы использование базового класса NSMutableArray для построения вашего стека цифр, хотя это имеет тот недостаток, что требует небольшого танца через NSNumber для хранения и получения:
static NSString names[] = { @"zero", @"one", @"two", @"three", @"four", @"five", @"six", @"seven", @"eight", @"nine" };
NSMutableArray* digits = [[NSMutableArray alloc] initWithCapacity:10] // arbitrary initial capacity
while ( input > 0 )
{
[digits insertObject:[NSNumber numberWithInt:input%10] atIndex:0];
input /= 10;
}
if ( [digits count] )
{
for ( int i = 0; i < [digits count]; ++i )
{
NSLog(@"%@", names[[[digits objectAtIndex:i] intValue]]);
}
}
else
{
NSLog(@"zero");
}
[digits release];
В противном случае, вы можете использовать массив C, но вместо инициализации массива нулевой длиной (что на самом деле кажется плохой идеей), вы можете инициализировать его с максимальной емкостью, которая вам когда-либо понадобится, например: число цифры самого большого int. Это может варьироваться в зависимости от длины слова, для которого вы компилируете, но вы можете определить это перед компиляцией. 32-битное int может быть длиной до 10 цифр; 64 бит 20. Код тогда достаточно похож:
int digits[20]; // hard coded array size constants are evil, of course
int last = 0;
while ( input > 0 )
{
digits[last++] = input % 10;
input /= 10;
}
if ( last )
{
while ( last --> 0 )
{
NSLog ( @"%@", names[digits[last]] );
}
}
else
{
NSLog(@"zero");
}
Этот подход поверхностно проще, но, безусловно, более подвержен ошибкам. (Действительно, поскольку я не запускал этот код, в нем почти наверняка есть ошибки!)
Другой способ сделать это - полностью разобраться в проблеме и использовать sprintf
, чтобы извлечь цифры в правильном порядке:
char digits[21]; // hard coded array size constants are *still* evil
sprintf(digits, "%d", input);
int ptr = 0;
while ( digits[ptr] )
{
NSLog(@"%@", names[digits[ptr++]]);
}
if ( ptr == 0 )
{
NSLog(@"zero");
}
Это, вероятно, считается обманом.
Обратите внимание, что scanf будет обрабатывать начальный знак минус на входе, поэтому номер входа может быть отрицательным; Работа с этой ситуацией оставлена в качестве упражнения.