鱼C论坛

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

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

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

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

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

x
//不使用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[count - 1] = num;
}while(num != -1);
printf("输入的整数分别是:");
for (i = 0; i < count; i++)
{
        printf("%d ", ptr[i]);
        
}
putchar('\n');
free(ptr);
return 0;
}
请问这两个报错什么意思,什么是可变参数,怎样就是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  参数是没有必要的,因为格式字符串中并没有占位符需要被替换。因此,你应该移除该参数以消除这个警告。

修复这个问题后的代码应该是这样的:
#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[count - 1] = num;
}while(num != -1);
printf("输入的整数分别是:");
for (i = 0; i < count; i++)
{
        printf("%d ", ptr[i]);
       
}
putchar('\n');
free(ptr);
return 0;
}
这段代码中删除了第一个  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  参数是没有必要的,因为格式字符串中并没有占位符需要被替换。因此,你应该移除该参数以消除这个警告。

修复这个问题后的代码应该是这样的:
#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[count - 1] = num;
}while(num != -1);
printf("输入的整数分别是:");
for (i = 0; i < count; i++)
{
        printf("%d ", ptr[i]);
       
}
putchar('\n');
free(ptr);
return 0;
}
这段代码中删除了第一个  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. 首先,需要在函数原型中至少声明一个必需参数,之后是三个点 (...),表示函数可以接受任意数量和类型的参数。

   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  宏来访问和处理这些可变参数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +10 鱼币

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 10:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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