houqing1999 发表于 2023-6-8 10:53:09

s1e38课上程序问题

//不使用mallo申请内存空间而使用realloc申请,
//让用户输入一个整数,每输入一个数,增加一个整型空间存放,
//直到输入“-1”表示输入结束,打印之前输入的所有数。
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int i, num;
int count = 0;
int* ptr = NULL;

do
{
        printf("请输入一个整数(输入-1表示结束):", &num);
        scanf("%d", &num);
        count++;

        ptr = (int*)realloc(ptr, count * sizeof(int));
       
        //如果ptr参数为NULL,那么调用realloc函数相当于调用malloc(size)
        if (ptr == NULL)
        {
                exit(1);
        }
        ptr = num;
}while(num != -1);
printf("输入的整数分别是:");
for (i = 0; i < count; i++)
{
        printf("%d ", ptr);
       
}
putchar('\n');
free(ptr);
return 0;
}
请问这两个报错什么意思,什么是可变参数,怎样就是0个1个,以及怎样通过修改代码高效解决问题

isdkz 发表于 2023-6-8 10:58:42

这个警告信息告诉你,你的printf语句提供的参数比格式字符串所需的多。这是因为你的格式字符串("请输入一个整数(输入-1表示结束):")没有包含任何占位符(例如 %d 或 %s),但你却在函数调用中提供了一个额外的参数&num 。

在C语言中,printf函数可以接受可变数量的参数。这意味着,除了必须的格式字符串参数之外,printf还可以接受0个、1个或多个额外参数,这些额外的参数通常用于替换格式字符串中的占位符。

但是,在你的代码中,printf语句 "请输入一个整数(输入-1表示结束):" 后面跟着的&num参数是没有必要的,因为格式字符串中并没有占位符需要被替换。因此,你应该移除该参数以消除这个警告。

修复这个问题后的代码应该是这样的:

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int i, num;
int count = 0;
int* ptr = NULL;

do
{
      printf("请输入一个整数(输入-1表示结束):");
      scanf("%d", &num);
      count++;

      ptr = (int*)realloc(ptr, count * sizeof(int));
      
      //如果ptr参数为NULL,那么调用realloc函数相当于调用malloc(size)
      if (ptr == NULL)
      {
                exit(1);
      }
      ptr = num;
}while(num != -1);
printf("输入的整数分别是:");
for (i = 0; i < count; i++)
{
      printf("%d ", ptr);
      
}
putchar('\n');
free(ptr);
return 0;
}

这段代码中删除了第一个printf语句的额外参数&num 。现在, printf语句只有一个参数,也就是它的格式字符串,这与其所需的参数数量一致,不会引发警告。

houqing1999 发表于 2023-6-8 11:15:00

isdkz 发表于 2023-6-8 10:58
这个警告信息告诉你,你的printf语句提供的参数比格式字符串所需的多。这是因为你的格式字符串("请输 ...

能否通俗易懂的尽量用c语言的知识解释一下什么是可变参数?

isdkz 发表于 2023-6-8 11:24:07

houqing1999 发表于 2023-6-8 11:15
能否通俗易懂的尽量用c语言的知识解释一下什么是可变参数?

在 C 语言中,有一些函数能够接受不确定数量的参数,这种函数我们称为具有可变参数的函数。比如我们常用的printf和scanf函数就可以接受任意数量的参数。

可变参数是通过使用一种叫做 stdarg(standard argument)的库实现的,它定义了一组宏来访问函数的参数列表。

以下是可变参数的使用步骤:

1. 首先,需要在函数原型中至少声明一个必需参数,之后是三个点 (...),表示函数可以接受任意数量和类型的参数。

      int function(int arg1, ...);
   

2. 在函数体内,我们需要使用 va_list 类型的变量(在这个例子中我们称其为args )来访问可变参数。

3. 使用va_start宏来初始化args变量。 va_start需要两个参数:va_list 变量和可变参数列表前的最后一个已知参数。

      va_start(args, arg1);
   

4. 使用va_arg宏来访问可变参数。 va_arg需要两个参数:va_list 变量和想要访问的参数的类型。

      int arg = va_arg(args, int);
   

5. 使用va_end宏来结束可变参数的访问。

      va_end(args);
   

以下是一个使用可变参数的例子,该函数计算任意数量的整数的和:

#include <stdio.h>
#include <stdarg.h>

int sum(int count, ...) {
    int total = 0;

    va_list args;
    va_start(args, count);

    for (int i = 0; i < count; i++) {
      total += va_arg(args, int);
    }

    va_end(args);

    return total;
}

int main() {
    printf("%d\n", sum(3, 1, 2, 3));// 输出 6
    printf("%d\n", sum(5, 1, 2, 3, 4, 5));// 输出 15

    return 0;
}


在这个例子中, sum函数可以接受任意数量的整数并计算它们的和。 count参数告诉函数有多少个额外的参数被传递进来。在函数体中,我们使用va_start 、 va_arg和va_end宏来访问和处理这些可变参数。

zhangjinxuan 发表于 2023-6-8 12:48:52

{:10_256:}
页: [1]
查看完整版本: s1e38课上程序问题