打印降序数组 C
Print descending array C
我必须为打印数组创建函数,用降序数字填充数组。
我创建了用于打印数组和创建降序的函数 array.But 我遇到了问题。
如果我使用自己的函数 printArray() 它会打印出一些不清楚的东西。问题出在哪里,我做错了什么?
请帮忙
这是 C 中的代码。value - 是数组的值
打印数组的函数:
void printArray (int arr[]){
int i;
printf("\n");
for(i = 0; i < value; i ++)
printf("%3d ", arr[i]);
}
创建降序数组的函数:
int createDescendingArray(int a[])
{
int i;
printf("\nDescending array is created.\n");
for (i = value; i > 0; i--) {
a[i] = i;
}
printArray(a); // print of created array
}
主要功能:
int main(){
int arr1[value]; //create new array
arr1[value] = createDescendingArray (arr1); //fill array with descending numbers
}
然而,当我不在函数 createDescendingArray() 中使用我的打印函数并使用如下标准方法在 Main 函数中打印它时:
{int i;
for(i = 0; i < value; i++)
{
a[i]=i;
printf("%3d", a[i]);
}
}
将降序数组显示为升序(看图)
它是如何工作的?
您一直在打印数组的函数中使用名为 value 的变量,但未对其进行初始化,因此是垃圾值。
您应该在函数中对其进行初始化或将其起始值作为参数传递给函数。
#include <stdio.h>
#include <stdlib.h>
void printArray(int *arr, int length)
{
int i;
printf("\n");
for (i = 0; i < length; i++)
{
printf("%3d ", arr[i]);
}
}
int *createDescendingArray(const int length)
{
if (length == 0)
return NULL;
int *a = malloc(length * sizeof(int));
;
printf("\nDescending array is created.\n");
for (int i = length-1; i >= 0; i--)
{
a[i] = i;
}
printArray(a, length); // print of created array
return a;
}
int main()
{
int *a = createDescendingArray(20);
printArray(a, 20);
return 0;
}
这些更改很可能可以解决问题,但同样,在创建数组的函数中也没有初始化值
编辑:如果长度为 0,则停止创建数组
EDIT2:修复了将 0 视为元素的代码
EDIT3:根据@CraigEstey 在评论中提出的建议修复了代码,经过测试和工作
EDIT4:修复了 for 循环并移除了 mallock 上的强制转换
函数
int createDescendingArray(int a[])
{
int i;
printf("\nDescending array is created.\n");
for (i = value; i > 0; i--) {
a[i] = i;
}
printArray(a); // print of created array
}
错了。
根据您问题的输出,您似乎已将 value
定义为 4
(您没有向我们展示带有定义的代码)。在这种情况下,上述函数的代码等同于以下内容:
int createDescendingArray(int a[])
{
printf("\nDescending array is created.\n");
a[4] = 4;
a[3] = 3;
a[2] = 2;
a[1] = 1;
printArray(a); // print of created array
}
除了展开循环外,我没有对代码做任何其他事情。
由于数组 a
的大小为 4 个元素,因此有效索引是从 0
到 3
。因此,通过写入 a[4]
,您正在越界写入数组,导致 undefined behavior.
如果你写了
for (i = value - 1; i >= 0; i--)
而不是
for (i = value; i > 0; i--)
那么展开的循环将是:
a[3] = 3;
a[2] = 2;
a[1] = 1;
a[0] = 0;
这样更好,因为现在我们已经修复了未定义的行为;您不再越界写入数组。然而,这仍然不是你想要的。如果你想要降序输出,你展开的循环必须看起来像这样:
a[0] = 3;
a[1] = 2;
a[2] = 1;
a[3] = 0;
这可以通过将函数更改为以下内容来实现:
int createDescendingArray(int a[])
{
int i;
printf( "\nDescending array is created.\n" );
for ( i = 0; i < value; i++ ) {
a[i] = value - i - 1;
}
printArray(a); // print of created array
}
这是一个小测试程序:
#include <stdio.h>
//NOTE: It is customary for constants to be written upper-case,
//not lower-case, so the line below should normally not be used.
#define value 4
void printArray (int arr[]) {
int i;
printf( "\n" );
for( i = 0; i < value; i++ )
printf("%3d ", arr[i]);
}
int createDescendingArray(int a[])
{
int i;
printf( "\nDescending array is created.\n" );
for ( i = 0; i < value; i++ ) {
a[i] = value - i - 1;
}
printArray(a); // print of created array
}
int main( void )
{
int array[value];
createDescendingArray( array );
}
输出为:
Descending array is created.
3 2 1 0
在这个测试程序中,我接管了你的大部分其他代码,但我没有接管函数main
,因为它也导致了未定义的行为:
int main(){
int arr1[value]; //create new array
arr1[value] = createDescendingArray (arr1); //fill array with descending numbers
}
行中
arr1[value] = createDescendingArray (arr1);
您正在将函数的 return 值赋给一个变量,尽管函数没有 return 值。这会导致未定义的行为。您可能需要考虑在函数声明中将 return 类型更改为 void
,如果它没有 return 值。
此外,即使函数 return 一个值,arr1[value]
也会越界写入数组,因为有效索引是从 0
到 value - 1
.
我必须为打印数组创建函数,用降序数字填充数组。
我创建了用于打印数组和创建降序的函数 array.But 我遇到了问题。 如果我使用自己的函数 printArray() 它会打印出一些不清楚的东西。问题出在哪里,我做错了什么? 请帮忙
这是 C 中的代码。value - 是数组的值
打印数组的函数:
void printArray (int arr[]){
int i;
printf("\n");
for(i = 0; i < value; i ++)
printf("%3d ", arr[i]);
}
创建降序数组的函数:
int createDescendingArray(int a[])
{
int i;
printf("\nDescending array is created.\n");
for (i = value; i > 0; i--) {
a[i] = i;
}
printArray(a); // print of created array
}
主要功能:
int main(){
int arr1[value]; //create new array
arr1[value] = createDescendingArray (arr1); //fill array with descending numbers
}
然而,当我不在函数 createDescendingArray() 中使用我的打印函数并使用如下标准方法在 Main 函数中打印它时:
{int i;
for(i = 0; i < value; i++)
{
a[i]=i;
printf("%3d", a[i]);
}
}
将降序数组显示为升序(看图) 它是如何工作的?
您一直在打印数组的函数中使用名为 value 的变量,但未对其进行初始化,因此是垃圾值。
您应该在函数中对其进行初始化或将其起始值作为参数传递给函数。
#include <stdio.h>
#include <stdlib.h>
void printArray(int *arr, int length)
{
int i;
printf("\n");
for (i = 0; i < length; i++)
{
printf("%3d ", arr[i]);
}
}
int *createDescendingArray(const int length)
{
if (length == 0)
return NULL;
int *a = malloc(length * sizeof(int));
;
printf("\nDescending array is created.\n");
for (int i = length-1; i >= 0; i--)
{
a[i] = i;
}
printArray(a, length); // print of created array
return a;
}
int main()
{
int *a = createDescendingArray(20);
printArray(a, 20);
return 0;
}
这些更改很可能可以解决问题,但同样,在创建数组的函数中也没有初始化值
编辑:如果长度为 0,则停止创建数组
EDIT2:修复了将 0 视为元素的代码
EDIT3:根据@CraigEstey 在评论中提出的建议修复了代码,经过测试和工作
EDIT4:修复了 for 循环并移除了 mallock 上的强制转换
函数
int createDescendingArray(int a[])
{
int i;
printf("\nDescending array is created.\n");
for (i = value; i > 0; i--) {
a[i] = i;
}
printArray(a); // print of created array
}
错了。
根据您问题的输出,您似乎已将 value
定义为 4
(您没有向我们展示带有定义的代码)。在这种情况下,上述函数的代码等同于以下内容:
int createDescendingArray(int a[])
{
printf("\nDescending array is created.\n");
a[4] = 4;
a[3] = 3;
a[2] = 2;
a[1] = 1;
printArray(a); // print of created array
}
除了展开循环外,我没有对代码做任何其他事情。
由于数组 a
的大小为 4 个元素,因此有效索引是从 0
到 3
。因此,通过写入 a[4]
,您正在越界写入数组,导致 undefined behavior.
如果你写了
for (i = value - 1; i >= 0; i--)
而不是
for (i = value; i > 0; i--)
那么展开的循环将是:
a[3] = 3;
a[2] = 2;
a[1] = 1;
a[0] = 0;
这样更好,因为现在我们已经修复了未定义的行为;您不再越界写入数组。然而,这仍然不是你想要的。如果你想要降序输出,你展开的循环必须看起来像这样:
a[0] = 3;
a[1] = 2;
a[2] = 1;
a[3] = 0;
这可以通过将函数更改为以下内容来实现:
int createDescendingArray(int a[])
{
int i;
printf( "\nDescending array is created.\n" );
for ( i = 0; i < value; i++ ) {
a[i] = value - i - 1;
}
printArray(a); // print of created array
}
这是一个小测试程序:
#include <stdio.h>
//NOTE: It is customary for constants to be written upper-case,
//not lower-case, so the line below should normally not be used.
#define value 4
void printArray (int arr[]) {
int i;
printf( "\n" );
for( i = 0; i < value; i++ )
printf("%3d ", arr[i]);
}
int createDescendingArray(int a[])
{
int i;
printf( "\nDescending array is created.\n" );
for ( i = 0; i < value; i++ ) {
a[i] = value - i - 1;
}
printArray(a); // print of created array
}
int main( void )
{
int array[value];
createDescendingArray( array );
}
输出为:
Descending array is created.
3 2 1 0
在这个测试程序中,我接管了你的大部分其他代码,但我没有接管函数main
,因为它也导致了未定义的行为:
int main(){
int arr1[value]; //create new array
arr1[value] = createDescendingArray (arr1); //fill array with descending numbers
}
行中
arr1[value] = createDescendingArray (arr1);
您正在将函数的 return 值赋给一个变量,尽管函数没有 return 值。这会导致未定义的行为。您可能需要考虑在函数声明中将 return 类型更改为 void
,如果它没有 return 值。
此外,即使函数 return 一个值,arr1[value]
也会越界写入数组,因为有效索引是从 0
到 value - 1
.