【问题标题】:A function to copy an array and store it in another array复制数组并将其存储在另一个数组中的函数
【发布时间】:2021-03-25 18:06:58
【问题描述】:

尝试创建一个 void 函数以将 a[n] 数组的副本返回到 b[n] 数组。我也试图颠倒数组的顺序。每次我返回它时,我都会得到一堆随机输出数字,而不是数组中的数字。我不太确定它从哪里获得随机数,任何帮助都会很棒。我在这里查看了其他类似的问题,但似乎无法让它为我工作。的函数名称必须保持不变。

 void copy(int n, int a[n], int b[n]){                                          
  for(int i = 0; i < n; ++i){                                            
   b[i] = a[i];                                                                
  }                                                                                                                                               
 }

void reverse(int n, int a[n]){                                                                                           
 int rev = n - 1;                                                                                                       
 int stop = n -1;                                                                                                       
 for (int i = 0; i < n / 2; i++){                                                                                       
  rev = a[i];                                                                                                          
  a[i] = a[stop];                                                                                                      
  a[stop] = rev;                                                                                                       
  stop--;                                                                                                              
 }                                                                                                                      
}          


int main() {
int a[N] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int b[N];
printf("This is an array: ");
print(N, a);
copy(N, b, a);
printf("This is a copy of the array: ");
print(N, b);
printf("This array is the reverse of the original array: ");
reverse(N, b);
print(N, b);
printf("\n");
}
        

我仍然得到这个作为输出。

这是一个数组:0 1 2 3 4 5 6 7 8 9

这是数组的副本:91455776032616 0 0-47662827221932-4766295202193254227025632766

这个数组是原数组的逆:91455776032616 0 0-47662827221932-4766295202193254227025632766

【问题讨论】:

  • 数组通常不会被'\0' 终止。只有字符串。您正在传递长度,为什么不使用它?你也想要b[i] = a[i]; 而不是b[n] = a[n];
  • 并且仅供参考,main 中的copy(N, b, a);a 定位为复制目标,使用b 作为复制源。因为b 没有初始化......是的。即使在修复循环之后,这仍然是错误的。
  • 循环条件应该是i &lt; n
  • 也只是备注,void 函数,即返回类型为 void 的函数不会“返回”值,因此您的表达式“尝试创建一个 void 函数以返回...”的副本不正确。当你使用“return”这个词时,意味着你的函数会有一个返回值,因此返回类型不能是void
  • 我忘了提到函数的名称需要保持不变。

标签: arrays c function


【解决方案1】:

您有几个错误:

  1. 您应该使用b[i] = a[i]; 而不是b[n] = a[n];
  2. 不要使用b[n]='\0'
  3. 数组不以'\0' 结尾。您应该使用条件i &lt; n 来检查 for 循环中数组的结尾。
  4. int a[] 等函数中传递数组,而不是 int a[n]
  5. 以正确的顺序传递函数中的数组,即copy(N, a, b);
void copy(int n, int a[], int b[]){
  for(int i = 0; i<n; ++i){
   b[i] = a[i];
  }
  //b[n] = '\0';
 }

void reverse(int n, int a[]){
 int rev = n - 1;
 int stop = n -1;
 for (int i = 0; i < n / 2; i++){
  rev = a[i];
  a[i] = a[stop];
  a[stop] = rev;
  stop--;
 }
}
void print(int n, int a[]){
    for(int i=0;i<n;i++){
        printf("%d ", a[i]);
    }printf("\n");
}

int main() {
    int N = 10;
int a[N] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int b[N];
printf("This is an array: ");
print(N, a);
copy(N, a, b);
printf("This is a copy of the array: ");
print(N, b);
printf("This array is the reverse of the original array: ");
reverse(N, b);
print(N, b);
printf("\n");
}

【讨论】:

  • 请不要cout。这是 C!
  • reverse 中,rev 不需要初始化器。更地道:for (i = 0; i &lt; stop; ++i, --stop)
  • @CraigEstey 我知道。我不想改变他的代码逻辑。我想让代码尽可能接近原始代码,这样他就不会不知所措。我刚刚列出并删除了错误。
  • 好的,很公平。对于新手 OP,我所做的是制作几个 [通常是 3 个] 版本。第一个只是修复直接错误。如果可以简化/改进代码,我会添加这些 [in a progress]。这样,OP 就得到了修复和一些关于更好编码的想法。 [他们似乎喜欢这种方法]。如果 OP 的代码偏离标准,我通常会进行完整的重构(即,它会让 OP 更快/更快地走上正确的轨道)。来自 Kernighan/Plauger 的“编程风格元素”:不要修补坏代码——重写它对于有经验的 OP,我只需在一个块中进行清理即可修复
  • @CraigEstey 感谢您的提示!我现在将遵循相同的表格。
【解决方案2】:

此检查a[i] != '\0' 可能对复制字符串有意义。但这不是你的情况。

还有这个作业

b[n] = a[n];

如果传递的数组具有n 元素,则可以调用未定义的行为。

通过以下方式声明和定义函数copy

void copy( const int a1[], int a2[], size_t n )
{                                          
    for ( size_t i = 0; i != n; i++ )
    {                                            
       a2[i] = a1[i];                                                                
    }                                                                             
}

然后像这样调用函数

copy( a, b, N );

在函数内反转这个语句

int rev = n - 1;                                                                                                       

没有意义。

像这样声明和定义函数

void reverse( int a[], size_t n )
{                                                                                           
    for ( size_t i = 0; i < n / 2; i++ )
    {                                                                                       
        int tmp = a[i];                                                                                                          
        a[i] = a[n - i - 1];                                                                                                      
        a[n - i - 1] = tmp;                                                                                                       
    }                                                                                                                      
}  

然后像这样调用函数

reverse( b, N );

这是一个演示程序。

#include <stdio.h>

#define N   10

void copy( const int a1[], int a2[], size_t n )
{                                          
    for ( size_t i = 0; i != n; i++ )
    {                                            
       a2[i] = a1[i];                                                                
    }                                                                             
}

void reverse( int a[], size_t n )
{                                                                                           
    for ( size_t i = 0; i < n / 2; i++ )
    {                                                                                       
        int tmp = a[i];                                                                                                          
        a[i] = a[n - i - 1];                                                                                                      
        a[n - i - 1] = tmp;                                                                                                       
    }                                                                                                                      
} 

FILE * print( const int a[], size_t n, FILE *fp )
{
    for ( size_t i = 0; i != N ; i++ )
    {
        fprintf( fp, "%d ", a[i] );
    }
    
    return fp;
}

int main(void) 
{
    int a[N] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int b[N];

    printf( "This is an array: " );

    putc( '\n', print( a, N, stdout ) );
    
    copy( a, b, N );

    printf( "This is a copy of the array: " );
    putc( '\n', print( b, N, stdout ) );

    printf("This array is the reverse of the original array: " );
    reverse( b, N );
    putc( '\n', print( b, N, stdout ) );
}

程序输出是

This is an array: 0 1 2 3 4 5 6 7 8 9 
This is a copy of the array: 0 1 2 3 4 5 6 7 8 9 
This array is the reverse of the original array: 9 8 7 6 5 4 3 2 1 0 

【讨论】:

  • 我看到你把参数顺序改成了void copy( const int a1[], int a2[], size_t n )。使用C2X,OP 的原始订单void copy( size_t n, const int a1[], int a2[] ) 仍然有用。
  • 我对C不太了解。什么是'size_t'?我可以只使用'int'吗?
  • @bildungsroman11 它是无符号整数类型。数组的大小由 size_t 类型的值计算。例如,运算符 sizeof 返回 size_t 类型的值。但在您的情况下,您可以使用 int 类型而不是 size_t。
  • 我明白了,谢谢你澄清这个问题。不幸的是,我必须保留函数的名称,就像我发布的原始代码一样。
  • @bildungsroman11 您可以更改参数的顺序,
猜你喜欢
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多