迭代C中的整数数字

我有一个像1191223这样的整数,我想迭代数字。 我不知道如何在C中做到这一点,有没有简单的方法来做到这一点?

谢谢。

前进还是后退?

假设一个正整数:

unsigned int n = 1191223; while (n != 0) { doSomething (n % 10); n /= 10; } 

…将从最小到最大,或……

编辑我忘记了我在这里的这个非工作解决方案。 请注意,Very Smart People™似乎始终使用从最小到最大的迭代(例如,Linux内核和GLibC的printf ,只是向后迭代)但如果您真的不想使用snprintf这是一种糟糕的方式由于某些原因…

 int left_to_right (unsigned int n) { unsigned int digit = 0; if (0 == n) { doSomething (0); } else { digit = pow(10, 1.0+ floor(log10(n))); while (digit /= 10) { doSomething ( (n / digit) % 10 ); } } } 

我认为假设你有log10pow而不是snprintf是非常愚蠢的,所以另一个计划是

 int left_to_right_fixed_max (unsigned int n) { unsigned int digit = 1000000000; /* make this very big */ unsigned int n10 = 10 * n; if (0 == n) { doSomething (0); } else { while (digit > n10) { digit /= 10; } while (digit /= 10) { doSomething ( (n / digit) % 10 ); } } } 

…或者,如果你真的没有硬件乘法/除法,你可以使用10的幂表。

 int left_to_right (unsigned int n) { static const unsigned int digit [] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 /* make this very big */ }; static const unsigned char max_place = 10; /* length of the above array */ unsigned char decimal; unsigned char place; unsigned char significant = 0; /* boolean */ if (0 == n) { doSomething (0); } else { place = max_place; while (place--) { decimal = 0; while (n >= digit[place]) { decimal++; n -= digit[place]; } if (decimal | significant) { doSomething (decimal); significant |= decimal; } } } } 

…我已经从http://www.piclist.com/techref/language/ccpp/convertbase.htm改编成了一个更通用的版本。

在下面我假设你的意思是十进制数字(基数为10)。 也许您可以通过替换10秒来使解决方案适应其他数字系统。

注意,模运算对于负操作数是一个棘手的事情。 因此,我选择数据类型为无符号整数。

如果您想先处理最低有效数字,可以尝试以下未经测试的方法:

 uint32_t n = 1191223; do { uint32_t digit = n%10; // do something with digit } while (n/=10); 

如果您希望从最高有效数字开始遍历数字,则可以尝试调整以下未经测试的代码:

 uint32_t n = 1191223; #define MAX_DIGITS 10 // log10((double)UINT32_MAX)+1 uint32_t div = pow(10, MAX_DIGITS); // skip the leading zero digits while ( div && !(n/div) ) div/=10; if ( !div ) div = 10; // allow n being zero do { uint32_t digit = (n/div)%10; // do something with digit } while (div/=10); 

你想迭代基数为10的数字,但是整数没有阿拉伯符号和数字的概念。 首先将其转换为字符串:

 int i = 1191223; char buffer[16]; char *j; snprintf(buffer, 16, "%i", i); for ( j = buffer; *j; ++j ) { /* digit is in *j - '0' */ } 

您可以使用sprintf()将其转换为char数组,然后像这样迭代(未经测试,只是为了让您入门):

 int a = 1191223; char arr[16]; int rc = sprintf(arr, "%d", a); if (rc < 0) { // error } for (int i = 0; i < rc; i++) { printf("digit %d = %d\n", i, arr[i]); } 
 void access_digits(int n) { int digit; if (n < 0) n = -n; do { digit = n % 10; /* Here you can do whatever you want to do with the digit */ } while ((n/=10) > 0); } 

像这样的东西:

 char data[128]; int digits = 1191223; sprintf(data, "%d", digits); int length = strlen(data); for(int i = 0; i < length; i++) { // iterate through each character representing a digit } 

请注意,如果使用像0100这样的八进制数,则还需要更改sprintf(data, "%d", digits);sprintf(data, "%o", digits);

一种hackish方式是将其转换为字符串(请参阅strtol),然后将其重新转换为数字。 你可以使用character you want - '0'

脱离我的头脑:“i%100000”,“i%100000”,……

递归解决方案可以让你从“i%10”开始。