如何正确使用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? 的相关文章

  • 如何获取正在访问 ASP.NET 应用程序的当前用户?

    为了获取系统中当前登录的用户 我使用以下代码 string opl System Security Principal WindowsIdentity GetCurrent Name ToString 我正在开发一个 ASP NET 应用程
  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 如何在浏览器的任意页面上直接运行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 它应