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个,以及怎样通过修改代码高效解决问题
这个警告信息告诉你,你的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语句只有一个参数,也就是它的格式字符串,这与其所需的参数数量一致,不会引发警告。 isdkz 发表于 2023-6-8 10:58
这个警告信息告诉你,你的printf语句提供的参数比格式字符串所需的多。这是因为你的格式字符串("请输 ...
能否通俗易懂的尽量用c语言的知识解释一下什么是可变参数? 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宏来访问和处理这些可变参数。 {:10_256:}
页:
[1]