如何正确使用va_list,add,start,end?

2024-02-07

我正在努力创建自己的 printf 函数。我从完成主项目所需的较小功能开始。

如果 i = 0,我的函数应该返回参数的总和,或者如果 i = 1,它应该返回作为参数传递的最后 nb 个字符串的大小总和。 因此,如果我有: ./a.out 0 2 3 3 ,它应该返回 6,例如。 然而,我得到的只是 1,如果第二个参数是 3,那么我得到一个奇怪的负数。

有人可以帮我解决这个问题,或者至少为我指出正确的方向吗? 先感谢您!

我尝试使用 vprintf 但我不知道如何正确使用它。顺便说一句,我现在使用 printf 的唯一原因是为了测试。完成后我将进行单元测试。

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

int my_getnbr(char const *str);

int sum_stdarg(int i, int nb, ... )
{
    int j = 0;
    int signal = 0;
    va_list(args);

    va_start(args, nb);
    while (nb > j) {
        if(i == 0) {
        signal = signal + va_arg(args, int);
    }
        else if (i == 1) {
        signal = signal + strlen(va_arg(args, char*));
    }
    j++;
    }
    va_end(args);
    return (signal);
}

int my_getnbr(char const *str)
{
    int i = 0;
    long cpy = 0;
    int intcpy;

    while ((str[i] < '0' || str[i] > '9') && str[i] != '\0')
        i++;
    if (str[i - 1] == '-') {
        while ((str[i] >= '0' && str[i] <= '9') && str[i] != '\0') {
            cpy = cpy * 10 - (str[i] - 48);
            i++;
        }
    } else {
        while ((str[i] >= '0' && str[i] <= '9') && str[i] != '\0') {
            cpy = cpy * 10 + (str[i] - 48);
            i++;
        }
    }
    if (cpy < -2147483648 || cpy > 2147483647)
        return (0);
    intcpy = cpy;
    return (intcpy);
}

int main(int ac, char **av)
{
    printf("%d\n", sum_stdarg(my_getnbr(av[1]), my_getnbr(av[2])));
    return (0);
}


va_list(args);

va_list 是一种类型,而不是函数。您应该声明一个 va_list 类型的变量并与其他 va_* 事物一起使用。

Next up:

int sum_stdarg(int i, int nb,  ... )  // '...' declared as third parameter
[...]
printf("%d\n", sum_stdarg( my_getnbr(av[1]),   my_getnbr(av[2])));  // 'sum_stdarg' called with 2 arguments

您实际上尚未提供 va_start 应该访问的任何参数。在这里调用 va_start 将导致未定义的行为。

如果你的第二个参数是 3,那么当你调用 sum_stdarg 时,两者都不会if在 while 循环中曾经触发过,所以你的返回变量永远不会被分配,并且当你返回时仍然包含未初始化的内存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确使用va_list,add,start,end? 的相关文章

随机推荐

  • 如何在浏览器的任意页面上直接运行jQuery?

    是否有某种编程方式 或者可能是浏览器插件 允许用户在当前加载到浏览器中的网页上任意运行他们想要的任何 jQuery Edit 我的动机是能够提前在页面上测试 jQuery 语法和命令 然后将它们添加到其源代码中 或者向我尝试过的页面的网络管
  • 如何在 swift 中将图标添加到共享表中?

    我在我的 iOS 应用程序中使用共享表 我想弄清楚如何在它打开时将图标添加到它的左上角 我添加了一个照片示例来说明我的意思 我的意思的示例照片 1 IBAction func shareButtonClicked sender Any Se
  • 如何安装和使用WinPcap?

    我今天访问 winpcap org 下载了安装程序 并在我的 Windows 7 笔记本电脑上安装了 WinPcap 但是 安装它的文件夹仅包含安装日志 名为 rpcapd exe 的可执行文件和卸载可执行文件 当我运行 rpcapd ex
  • Twitter API:用户名的 URL 搜索

    我有一个网站列表 我想查看它们是否有 Twitter 帐户 我很好奇 API 中是否有用户名的 url 搜索 或者类似的东西 我一直在阅读和环顾四周 然而 我还不够 当我可以运行一个函数来为我完成这项工作时 我不想手动执行此操作 非常感谢有
  • 当 onClick 设置时,EditText 的 android:nextFocusDown 属性停止工作

    有谁知道为什么 android nextFocusDown 属性在我们设置 onClick 时停止工作 在下面的示例中 我们有一些定义了此属性的 EditText
  • SQL Server 中的列名不明确

    1 https i stack imgur com mQimv png CREATE VIEW planView SELECT planID planName cost quota maxSpeed shapedSpeed typeID t
  • 如何从给定日期获取一个月的最后一天?

    例如 给定日期是1924 年 4 月 4 日我想找出 1924 年二月的最后一天 我想出了 add month 但如果我有来自数据源的不同给定月份 它似乎不灵活 有什么好主意吗 甲骨文有一个last day http docs oracle
  • GCC 错误:命令“gcc-4.0”失败,退出状态为 1

    我正在尝试使用 Xcode 4 2 将 Fabric 安装到 Virtualenv Django 1 3 1 OS X Lion 中 这个错误似乎是相当普遍 https stackoverflow com questions 6906385
  • BigQuery:GHTorrent 何时刷新以及如何获取最新信息?

    The ghtorrent bq数据很高兴有 GitHub 的快照 但是 尚不清楚它何时更新以及我如何获取更多最新数据 理论上 每次发布新的 GHTorrent MySQL 转储时都会更新它 实际上 仍然需要对生成的 CSV 进行手动调整
  • C++ 视频流检测 FPS

    我尝试从轴或 eneo 相机获取视频流的正确 fps rtsp 192 168 0 1 554 axis media media amp I use cv VideoCapture get CV CAP PROP FPS https doc
  • 获取解决方案中使用的所有 NuGet 包的列表

    我正在寻找一种方法 使用命令行脚本而不是在 Visual Studio 中手动获取解决方案 特别是版本 中每个项目中所有使用的 NuGet 包的列表 使用包管理器控制台和命令 Get Package 给了我我想要的东西 但它在 VS 之外不
  • IAP 实际验证收据 (Swift)

    我一直在尝试在我的 spritekit 游戏中实现收据验证 我一直在关注各种教程 基本上最终得到了这段代码 enum RequestURL String case production https buy itunes apple com
  • 尝试让phonegap的Android LocalNotification插件在cordova-1.6.0中工作

    我正在尝试将使用适用于 Android 的 LocalNotification 插件的 Phonegap 1 4 1 项目升级到 cordova 1 6 0 我在这里找到了这个链接 https github com davejohnson
  • VisibleDeprecationWarning - 这是从哪里来的?

    我正在编写一些代码来用 python 模拟量子计算机 我刚刚添加了一个开始集成大于一个量子位功能的部分 然后出现了这个奇怪的错误 它没有说明是哪一行引起的 所以我什至不知道从哪里开始修复它 而且我以前从未见过它 此外 即使出现此错误 该程序
  • 无法通过 AWS EC2 实例上的 Gunicorn 访问 Django 默认应用程序

    我已经为这个问题苦苦挣扎了两天 但没有成功 我创建了一个名为 testdj 的默认 Django 1 6 1 应用程序实例 将其安装在运行 Ubuntu Server 13 10 的 Amazon AWS EC2 t1 micro 实例上
  • 如何在 IntelliJ IDEA 中使用 Lombok 生成的 setter 方法中设置断点?

    有办法进去吗智能IDEA设置一个断点在由以下方法生成的 setter 方法中Lombok 这在某些调试场景中非常有用 例如查看何时从 Hibernate 等框架调用 setter 事实上 生成的setter方法显示在IntelliJ IDE
  • 尽管有主键,MagicalRecord 关系映射仍会重复对象

    我需要一些帮助来解决我在 MagicalRecord 数据导入方面遇到的问题 我的印象是 MagicalRecord 能够通过查看主键来处理关系映射 而无需复制对象 relatedByAttribute 这是一个简单的 JSON paren
  • 哪个线程处理该信号?

    我有 2 个线程 线程 1 和线程 2 我有信号配置SIGINT 每当SIGINT发生线程2应该处理该信号 为此我写了下面的程序 include
  • 承诺的不可变性及其保证价值意味着什么?

    我试图理解es6 Promise 和常规回调之间的区别 http www datchley name es6 promises 但不要得到下面的例子 有人可以展示使用回调执行以下操作会是什么样子吗 an immediately resolv
  • 如何正确使用va_list,add,start,end?

    我正在努力创建自己的 printf 函数 我从完成主项目所需的较小功能开始 如果 i 0 我的函数应该返回参数的总和 或者如果 i 1 它应该返回作为参数传递的最后 nb 个字符串的大小总和 因此 如果我有 a out 0 2 3 3 它应