[英]I don't know what I'm doing wrong with this Array
我试图分离一个序列的数字,并将它们全部存储在一个数组中。
对于我所看到的 C 的一点点,我没有做错任何事情,程序编译完美,但是在打印数字的那一刻,它就不起作用了。
我正在尝试做的事情的解释是最后。
long int number;
do
{
number = get_long("number:\n");
}
while (number<1 || number>9999999999999999);
int numbers[16], n;
//We separate the numbers, from right to left
for (long int I=10; I>100000000000000000; I*=10)
{
for (long int J=1; J>100000000000000000; J*=10)
{
for (n=0; n>16; n++)
{
numbers[n]=(number%I)/J;
}
}
}
printf("%i\n", numbers[1]);
它应该接受 1 位到 16 位的数字,并将每个数字分开。
例如,如果我们有16
,它将1
和6
分成两位数,使6
成为第一位, 1
成为第二位,所以它会从右到左开始计数。 它应该将每个数字存储在 16 个空格的数组中。 然后我只打印第二个数字,以确保它确实有效,但是当我运行它时,它只给我0
; 这意味着它不起作用,但我认为它没有问题。
可能是我太缺乏经验,或者我没有必要的知识,无法在代码中看到问题。
>
反转为<
后,即使只有 16 位数字,您最终也会评估内部循环的主体 16*16*16 = 4096 次。 应该只有一个 16 次迭代的循环。long int
不仅保证支持最多2,147,483,647
的数字。 相反,请使用long long int
、 int_least64_t
或int64_t
之一,或它们的无符号对应项之一。您试图编写以下内容:
uint64_t mod = 10; // Formerly named I
uint64_t div = 1; // Formerly named J
for (int n=0; n<16; ++n) {
numbers[n] = ( number % mod ) / div;
mod *= 10;
div *= 10;
}
但这比需要的要复杂一些。 让我们交换除法和模数的顺序。
uint64_t div = 1;
for (int n=0; n<16; ++n) {
numbers[n] = ( number / div ) % 10;
div *= 10;
}
最后,如果我们不介意在此过程中破坏number
,我们可以再简化一点。
for (int n=0; n<16; ++n) {
numbers[n] = number % 10;
number /= 10;
}
如果使用long
变量,则取值范围为: -2147483648 to 2147483647
所以表达式while (number<1 || number>9999999999999999);
(和类似的)没有意义。 作为一个数字, number
永远不会接近9999999999999999
。 表达式相同: ...J>100000000000000000; J*=10)
...J>100000000000000000; J*=10)
。 (在这一点上它真的没有实际意义,但>
应该是<
)
考虑使用字符串方法:
使用 null 终止的字符数组(C 字符串)来保存初始值,基本步骤非常简单,可能包括以下内容:
char number[17];//room for 16 characters + null terminator
scanf("%16s", number);//string comprised of maximum of 16 digits
len = strlen(number);
int num_array[len];//using VLA
memset(num_array, 0, sizeof num_array);//zero array
for(int i = 0;i < len; i++)
{
if(number[i] < '0' || number[i] > '9') break;//qualify input. Break if non-numeric
num_array = number[i] - '0';
}
您的所有for
循环都在使用operator>
而应该使用operator<
。 因此,循环条件总是错误的( 10
不>
100000000000000000
, 1
不>
100000000000000000
, 0
不>
16
),因此根本不会输入循环,因此numbers[]
未填充。
解决这个问题,你仍然有一个逻辑问题。 想想当number
为16
并且I
和J
是大值时(number%I)/J
的结果是什么。 operator/
的结果通常为0
,在某些循环迭代中, numbers[]
会填充正确的值。 但是其他迭代将用0
覆盖numbers[]
。 一旦所有的循环都完成了,就只剩下0
了。
这个在线演示演示了这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.