鱼C论坛

 找回密码
 立即注册
查看: 598|回复: 4

[已解决]s1e38课上程序问题

[复制链接]
发表于 2023-6-8 10:53:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

  16.         ptr = (int*)realloc(ptr, count * sizeof(int));
  17.        
  18.         //如果ptr参数为NULL,那么调用realloc函数相当于调用malloc(size)
  19.         if (ptr == NULL)
  20.         {
  21.                 exit(1);
  22.         }
  23.         ptr[count - 1] = num;
  24. }while(num != -1);
  25. printf("输入的整数分别是:");
  26. for (i = 0; i < count; i++)
  27. {
  28.         printf("%d ", ptr[i]);
  29.        
  30. }
  31. putchar('\n');
  32. free(ptr);
  33. return 0;
  34. }
复制代码

请问这两个报错什么意思,什么是可变参数,怎样就是0个1个,以及怎样通过修改代码高效解决问题
屏幕截图 2023-06-08 104809.png
最佳答案
2023-6-8 10:58:42
这个警告信息告诉你,你的  printf  语句提供的参数比格式字符串所需的多。这是因为你的格式字符串("请输入一个整数(输入-1表示结束):")没有包含任何占位符(例如 %d 或 %s),但你却在函数调用中提供了一个额外的参数  &num 。

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

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

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

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main(void)
  4. {
  5. int i, num;
  6. int count = 0;
  7. int* ptr = NULL;

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

  13.         ptr = (int*)realloc(ptr, count * sizeof(int));
  14.       
  15.         //如果ptr参数为NULL,那么调用realloc函数相当于调用malloc(size)
  16.         if (ptr == NULL)
  17.         {
  18.                 exit(1);
  19.         }
  20.         ptr[count - 1] = num;
  21. }while(num != -1);
  22. printf("输入的整数分别是:");
  23. for (i = 0; i < count; i++)
  24. {
  25.         printf("%d ", ptr[i]);
  26.       
  27. }
  28. putchar('\n');
  29. free(ptr);
  30. return 0;
  31. }
复制代码

这段代码中删除了第一个  printf  语句的额外参数  &num 。现在, printf  语句只有一个参数,也就是它的格式字符串,这与其所需的参数数量一致,不会引发警告。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-8 10:58:42 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +10 鱼币

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

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

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

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

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main(void)
  4. {
  5. int i, num;
  6. int count = 0;
  7. int* ptr = NULL;

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

  13.         ptr = (int*)realloc(ptr, count * sizeof(int));
  14.       
  15.         //如果ptr参数为NULL,那么调用realloc函数相当于调用malloc(size)
  16.         if (ptr == NULL)
  17.         {
  18.                 exit(1);
  19.         }
  20.         ptr[count - 1] = num;
  21. }while(num != -1);
  22. printf("输入的整数分别是:");
  23. for (i = 0; i < count; i++)
  24. {
  25.         printf("%d ", ptr[i]);
  26.       
  27. }
  28. putchar('\n');
  29. free(ptr);
  30. return 0;
  31. }
复制代码

这段代码中删除了第一个  printf  语句的额外参数  &num 。现在, printf  语句只有一个参数,也就是它的格式字符串,这与其所需的参数数量一致,不会引发警告。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

能否通俗易懂的尽量用c语言的知识解释一下什么是可变参数?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

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

  
  1.    int function(int arg1, ...);
  2.    
复制代码


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

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

  
  1.    va_start(args, arg1);
  2.    
复制代码


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

  
  1.    int arg = va_arg(args, int);
  2.    
复制代码


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

  
  1.    va_end(args);
  2.    
复制代码


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

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

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

  5.     va_list args;
  6.     va_start(args, count);

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

  10.     va_end(args);

  11.     return total;
  12. }

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

  16.     return 0;
  17. }
复制代码


在这个例子中, sum  函数可以接受任意数量的整数并计算它们的和。 count  参数告诉函数有多少个额外的参数被传递进来。在函数体中,我们使用  va_start 、 va_arg  和  va_end  宏来访问和处理这些可变参数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-8 12:48:52 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 11:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表