【问题标题】:writing function with pointers in c在c中用指针编写函数
【发布时间】:2023-03-24 07:05:01
【问题描述】:

我写了这段代码:

#include <stdio.h>
void transpose(int *Al[]){
int x=0;
int z=0;
int k=1;
while (*Al[z] != "\0") {
    int c=*Al[z];
    if (c>x)
        x=c;
   z++;
}
printf("%d ",x);
for(int o=0;o<6;o++){
   for(int i=0 ;i<x;i++ ) {
       int *p = Al[i];
       int l=*p;
       if(k<l)
       printf("%d ",*(p+k));
       else
           printf("   ");
   }
   k++;
   printf("\n");
   }

   }
   int main() {
   int A[] = {5, -5, 14, 5, 2};
   int B[] = {3, 6, 11};
   int C[] = {4, 1, -3, 4};
   int D[] = {6, 2, 7, 1, 8, 2};
   int E[] = {2, 15};
   int F[] = {3, 4, -2};
   int *All[] = {A, B, C, D, E, F, NULL};
   transpose(All);
   }

函数获取指向不同数组的数组我需要使用指针打印数组 输出应该是:

-5 6   1 2 15 4
14 11 -3 7    -2
5      4 1     
2        8      
         2

但是这段代码不打印任何东西。 它指向第一个值的数组也是数组的大小。 我试过这个:

void transpose(int *Al[]){
int x=0;
int z=0;
int k=1;
for(int o=0;o<5;o++){
    for(int i=0 ;i<6;i++ ) {
        int *p = Al[i];
        int l=*p;
        if(k<l)
            printf("%d ",*(p+k));
        else
            printf("   ");
    }
    k++;
    printf("\n");
    }

 }

只有我需要替换循环中的五个和六个 5 是所有数组中最大的大小 -1 所以我会知道要打印多少行,而 6 是 All 中的多少个数组,所以我可以知道我应该打印多少列。有解决办法吗?

【问题讨论】:

  • 您的代码如何知道AB 等有多长?它不能。它们不是以空值终止的,而且你没有考虑它们的大小。试着想出一个你想要如何处理它的设计。
  • 此外,您的示例输出中缺少每个 AB 等数组的第一个值。这是故意的吗?
  • 你认为while (*Al[z] != "\0") {... 是做什么的?您正在将 int 值与字符串文字的地址进行比较。
  • while (*Al[z] != "\0") 你的编译器是否警告过你这行?如果没有,您需要将其丢弃并获得更好的编译器。如果是,在询问其他任何内容之前,您需要询问警告、它的含义以及如何解决它。更好的是,启用编译器选项以将所有警告视为错误,请参阅here
  • 只需将while (*Al[z] != "\0") { 更改为while (Al[z] != NULL) { 似乎 即可修复代码。输出中有一些有趣的间距,但数字是你说你应该得到的。

标签: arrays c loops pointers function-definition


【解决方案1】:

while循环中的条件

while (*Al[z] != "\0") {

没有意义。表达式*Al[z] 的类型为int,而字符串文字"\0" 的类型为char *

还不清楚为什么在这个循环中会出现幻数6

for(int o=0;o<6;o++){

无需显式计算列数,因为您的标记值等于NULL

我可以建议例如以下解决方案

#include <stdio.h>

void transpose( int * Al[] )
{
    int rows = 0;
    
    for ( int **p = Al; *p != NULL; ++p )
    {
        if ( rows < **p ) rows = **p;
    }
    
    if ( rows ) --rows;
    
    for ( int i = 0; i < rows; i++ )
    {
        for ( int **p = Al; *p != NULL; ++p )
        {
            if ( i + 1 < **p ) printf( "%2d ", *( *p + i + 1 ) );
            else printf( "   " );
        }
        
        putchar( '\n' );
    }
    
}

int main(void) 
{
    int A[] = {5, -5, 14, 5, 2};
    int B[] = {3, 6, 11};
    int C[] = {4, 1, -3, 4};
    int D[] = {6, 2, 7, 1, 8, 2};
    int E[] = {2, 15};
    int F[] = {3, 4, -2};
    int *All[] = { A, B, C, D, E, F, NULL };
   
    transpose( All );
   
    return 0;
}

程序输出是

-5  6  1  2 15  4 
14 11 -3  7    -2 
 5     4  1       
 2        8       
          2 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多