【问题标题】:Returning largest number from an array using an int function not printing value使用不打印值的 int 函数从数组中返回最大数
【发布时间】:2021-12-11 05:30:36
【问题描述】:

我正在尝试创建一个小程序,它接收一个数组并从数组中返回最大的数。我能够使用带有初始化程序“void”的函数创建程序,但不明白为什么我不能使用“int”对不同的函数执行相同的操作。

在使用函数int largestNum(int *length,int numberArr[]) 时,我收到错误“不兼容的指针类型从结果类型为'int *'的函数返回'int *(int *, int *)'”。任何解释表示赞赏。

输入:
元素 0 - 23
元素 1 - 12
元素 2 - 34

输出: 34

使用 void 的函数:

void largestNum(int *length,int numberArr[]){

 int largestNumber = numberArr[0];

 for(int x = 1;x < *length;x++){
   if (numberArr[x] > largestNumber)
   largestNumber = numberArr[x];
  }
  printf("%d", largestNumber);
 }


int main(){

 int numbersArr[100];
 int input;
 int num;
 int count = 0;
 
 printf("Input total number of elements (1-100): ");
 scanf("%d", &num);

 for(int x = 0; x < num; x++){
   printf("Element %d - ", count);
   scanf("%d", numbersArr + x);
   count++;
 }


 largestNum(&count, numbersArr);

 return 0;
 }

使用 int 的函数:

int largestNum(int *length,int numberArr[]){

 int largestNumber = numberArr[0];

 for(int x = 1;x < *length;x++){
   if (numberArr[x] > largestNumber)
   largestNumber = numberArr[x];
 }
 return largestNumber;
} 


int main(){

 int numbersArr[100];
 int input;
 int num;
 int count = 0;

 printf("Input total number of elements (1-100): ");
 scanf("%d", &num);

 for(int x = 0; x < num; x++){
   printf("Element %d - ", count);
   scanf("%d", numbersArr + x);
   count++;
 }


  largestNum(&count, numbersArr);

  printf(largestNum);

 return 0;
 }

【问题讨论】:

  • 没有理由将数组长度作为指针传递,只是传递值。
  • 使用-Wall -Wextra -Wpedantic -Werror 并修复编译器抱怨的所有问题。

标签: arrays c printf return-value function-definition


【解决方案1】:

largestNum 是一个声明为类似的函数

int largestNum(int *length,int numberArr[]);

所以在这次通话中

printf(largestNum);

函数指示符被隐式转换为 int( int *, int * ) 类型的指针,但函数 printf 需要 char * 类型的第一个参数。那就是上面对printf 的调用没有意义。您需要输出函数的返回值。例如

printf("%d\n", largestNum(&count, numbersArr) );

注意一般函数是不正确的。当表达式*length 的值等于0 时,它可以调用未定义的行为。

通过引用传递第一个参数也没有什么意义。 并且由于数组在函数中没有被改变,它应该用限定符 const 声明。

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

size_t largestNum( const int numberArr[], size_t n )
{
    size_t largestNumber = 0;

    for ( size_t i = 1; i < n; i++ )
    {
        if ( numberArr[largestNumber] < numberArr[i] )
        {
            largestNumber = i;
        }
    }
    
    return largestNumber;
} 

并且函数可以像这样调用

size_t pos = largestNum( numbersArr, count );
printf("%d\n", numbersArr[pos] );

要在指定第二个参数等于 0 时检查错误,您可以这样写

size_t pos = largestNum( numbersArr, count );
if ( pos != count ) printf("%d\n", numbersArr[pos] );

【讨论】:

  • 感谢您的帮助。我假设您的意思是 printf 语句中的“%d”而不是“%zu”?
  • @SimTim124 因为我将返回类型声明为 size_t 然后要输出这种类型的对象,您必须使用转换说明符 %zu。
  • 我明白了。我收到警告“格式指定类型'size_t'(又名'unsigned long')但参数的类型为'int' [-Wformat] printf("%zu\n", numbersArr[pos]); "当我用 %zu 运行代码而不是用 %d 替换它时?
  • @SimTim124 哦,这是我的错字。当我们输出数组的元素类型为 int 时,确实需要使用转换说明符 %d。我已经更新了我的答案。:)
  • 太棒了。谢谢!
【解决方案2】:

您需要将值保存在变量中,例如:

a = largestNum(&count, numberArr);
printf("%d", a);

或者你可以只调用 printf 中的函数

printf("%d", largestNum(&count, numberArr))

【讨论】:

    猜你喜欢
    • 2018-04-09
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2020-02-28
    • 2015-01-18
    相关资源
    最近更新 更多