问题描述
我在以下方面遇到麻烦:我想取一个大数(大约15位数字)并将其转换为单个数字并将其存储在数组中。我将在代码中进一步使用这些数字。问题是,如果我在while循环外声明该数组,它将存储前四个值,但随后出现分段错误。如果我在循环中声明它,那么代码将按我希望的那样工作,但是然后我不知道如何将数组移出该循环,因此我无法进一步使用它。我该如何解决?这是我编译的:
unsigned long long card_num;
printf("Enter your credit card number:\n");
scanf("%llu",&card_num);
int count = 0;
while (card_num != 0)
{
int digits[count]; //declaring array into which digits will be stored
digits[count] = card_num%10; // get last digit,store it in array
card_num = card_num/10; //remove last digit
printf("Digit[%i] = %i\n",count,digits[count]);
printf("Number of digits: %i\n",count);
count ++;
}
解决方法
在您的代码中,第一次迭代
int digits[count];
count
是0
,这违反了规范中提到的约束。根据{{1}},第6.7.5.2章,
除了可选的类型限定符和关键字
C11
外,static
和[
还可以分隔表达式或]
。如果它们定界表达式(指定数组的大小),则该表达式应具有整数类型。如果表达式是一个常量表达式,则其值应大于零。 [....]
和
如果size是一个不是整数常量表达式的表达式:如果它出现在函数原型范围的声明中,则将其视为由
*
替换;否则,每次对其进行评估时,其值都应大于零
所以,这不是有效的代码。
,如前所述,您在做什么是完全错误的。
有几种方法可以解决此问题。最简单的方法是在程序的开头分配一个数组,为所有用例分配足够的空间,例如:
#define MAX_DIGIT 50
int digits[MAX_DIGIT];
然后,您只需检查count < MAX_DIGIT
,即可检查自己是否没有遍历此数组。
另一种方法是,一旦知道所需数组的大小,就可以使用int指针int *digits
和malloc
(我让你用谷歌搜索)来进行动态内存分配。在开始获取数字之前,您必须稍稍更改代码以了解数字的数量,因为在开始存储数字之前需要分配内存。
您可以使用realloc
来保持与现有代码相似的代码,但是我不建议您这样做,因为为您添加的每个值重新分配内存效率不高。
您的逻辑很好。
出问题的是,您尝试在迭代的同时尝试增加定长数组的长度。
您应该从不在程序中的任何位置更改固定长度数组的长度。
但是,如果要在运行时更改数组的长度,则必须使用 malloc 和 realloc 函数。
查看此示例:
//declarations
int *storeNum;
storeNum = (int *)malloc(1 * sizeof(int));
//logic
while(num != 0) {
if(i > 0)
storeNum = realloc(storeNum,(i+1) * sizeof(int));
storeNum[i] = num % 10;
num = num/10;
++i;
}
首先,我首先声明数组大小为1,然后使用 realloc 函数将其递增。
您还将数组大小存储在 i 中,以后可以在循环代码中使用。
但是请记住,这些数字将以相反的顺序存储在您的数组中。
此外,您不应在循环中声明数组。
由于您已经“声明”了数组,因此每次编译器在迭代时进入循环时,都会将数组声明视为新数组。就是这样。