繁体   English   中英

我不知道我对这个数组做错了什么

[英]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 ,它将16分成两位数,使6成为第一位, 1成为第二位,所以它会从右到左开始计数。 它应该将每个数字存储在 16 个空格的数组中。 然后我只打印第二个数字,以确保它确实有效,但是当我运行它时,它只给我0 这意味着它不起作用,但我认为它没有问题。

可能是我太缺乏经验,或者我没有必要的知识,无法在代码中看到问题。

  • 您的循环终止检查不正确,因此永远不会进入循环。
  • >反转为<后,即使只有 16 位数字,您最终也会评估内部循环的主体 16*16*16 = 4096 次。 应该只有一个 16 次迭代的循环。
  • long int不仅保证支持最多2,147,483,647的数字。 相反,请使用long long intint_least64_tint64_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> 1000000000000000001> 1000000000000000000> 16 ),因此根本不会输入循环,因此numbers[]未填充。

解决这个问题,你仍然有一个逻辑问题。 想想当number16并且IJ是大值时(number%I)/J的结果是什么。 operator/的结果通常为0 ,在某些循环迭代中, numbers[]会填充正确的值。 但是其他迭代将用0覆盖numbers[] 一旦所有的循环都完成了,就只剩下0了。

这个在线演示演示了这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM