printf 通过给定的指针和格式字符串。浮动问题

2024-01-12

由于我想跟踪一些变量以便查看它们如何变化,因此我想创建一个函数,该函数根据变量的类型和指向值的指针接收格式字符串。我希望,在格式字符串的帮助下, printf 能够正确确定该值。实际上它是有效的,但有一个例外 - 浮点值无法正确打印。

这是我的代码:

#include <stdio.h>

void pprint (char* fmtstr, void* p)
{
        printf(fmtstr,*(long double *)p);
}

int main (int argc, char **argv)
{
        char cval = 64;
        int ival = -534;
        unsigned int iuval = 535;
        float fval = 534.64;
        double dval = 53432.1;
        long double ldval = 534321234.134567;
        long long lval = -654321;
        unsigned long long luval = 7654321;

        pprint ("char: %hhd\n",&cval);
        pprint ("int: %d\n",&ival);
        pprint ("uint: %u\n",&iuval);
        pprint ("float: %f\n",&fval);
        pprint ("double: %f\n",&dval);
        pprint ("long double: %Lf\n",&ldval);
        pprint ("llong: %lld\n",&lval);
        pprint ("ullong: %llu\n",&luval);
        return 0;
}

结果是:

char: 64
int: -534
uint: 535
float: 0.000000
double: 53432.100000
long double: 534321234.134567
llong: -654321
ullong: 7654321

正如我们所看到的,除了浮动之外,所有内容都打印正常。 然而,在对 pprint 函数进行一些修改之后(将 void 指针转换为 float):

printf(fmtstr,*(float*)p);

结果是:

char: 0
int: 1073741824
uint: 0
float: 534.640015
double: 0.000000
long double: 0.000000
llong: -351285912010752
ullong: 4038940431088615424

现在只有浮点值可以正确打印。 另一个副作用是,转换为任何其他类型都会导致成功打印具有较小或相同大小的类型。 (如果我转换为 int,它将正确打印字符,但不会打印长整型)。因此,转换为 long double 可以解决这个问题,因为它具有最大的尺寸。

然而,浮动的问题仍然存在。为了打印浮点值,我需要将指针转换为浮点型,但仅此而已。相反:当我转换为浮动时,除了浮动之外的所有内容都会失败。取消引用不是与读取位于指向地址的数据并将其传递给 printf 相关吗? (相同的指针,转换为任何类型都保留相同的地址?)然后,格式字符串能够以正确的格式“读取”给定的字节 - char、int、unsigned int 等。

我听说,可变参数函数中的浮点值会转换为双精度值。这与问题有关吗?另外,在某些情况下,我无法提供双精度值 - 因为例如 Opengl 中使用的许多变量都是浮点数 (GLfloat)。

总而言之,我有2个问题。

  1. 为什么浮动的行为与所有其他类型不同。

  2. 使用这个功能会产生副作用吗?我的意思是,当打印例如 int 时, printf 接收 12 个字节 (sizeof(long double)) 作为第二个参数,但只读取 4 个字节(“%d”格式字符串)。在这 12 个字节中,前 4 个属于我要打印的 int 值,接下来的 8 个是垃圾,printf 永远不会读取它们。这是一个问题吗?

谢谢。


这既不能回答您的任何问题,但您可能想研究一下vprintf http://www.manpagez.com/man/3/vprintf/如果你想包装 printf。

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

printf 通过给定的指针和格式字符串。浮动问题 的相关文章

随机推荐

  • 将streambuf的内容复制到字符串

    显然boost asio async read不喜欢字符串 因为它是唯一的重载boost asio buffer让我能够创造const buffers 所以我不得不将所有内容读入流缓冲区 现在我想将streambuf的内容复制到一个字符串中
  • 带有简单 Web 包装器的 python tkinter

    我正在编写一个带有 UI 的简单 python 程序 但我不知道如何将网页放入程序中 我尝试在 Google 上搜索 但找不到任何简单的实现 任何链接都会很棒 回顾一下 我只想要一个简单的 GUI python 程序 其中嵌入了一个网页 基
  • 用户单击 ajax 调用后,打开新选项卡而不使用弹出窗口阻止程序

    我有一个页面 使用户能够通过 HTML5 画布执行图像操作 在该页面上 有一个 facebook 共享按钮 用于在 facebook 上共享画布的生成图像 单击链接时 将向服务器 ASP NET MVC 发送一个ajax请求以执行图像生成
  • 在 javascript 中注入 PHP 的转义字符的正确组合?

    我已经尝试了所有我知道的组合 但无法得到正确的结果 echo lt lt
  • C 中 ptrdiff_t 在哪里定义?

    哪里ptrdiff t在C中定义 它定义在stddef h 该标头定义了整数类型size t ptrdiff t and wchar t 函数宏offsetof 以及常数宏NULL
  • 使用 artisan migrate 时出现流明错误

    我是 Lumen 新手 当我尝试使用时 php artisan migrate 我收到以下错误 PDOException SQLSTATE HY000 2002 No such file or directory 如果我将 localhos
  • 如何在C++中计算文件的行数?

    如何使用标准类来计算行数 fstream and ifstream 这个怎么样 std ifstream inFile file std count std istreambuf iterator
  • 续集查询的可选参数

    早上好 我对 NodeJS sequelize 世界相当陌生 目前在尝试在屏幕上显示仪表板时遇到问题 该仪表板具有三个过滤器 两个日期 期间 客户姓名和员工姓名 用户可以选择无 一个 两个或所有过滤器 我的数据库需要相应地工作 话虽这么说
  • 在 CSS 中创建具有可滚动内容的可变高度“固定”标题

    我想在页面上创建一个标题 当您滚动页面时该标题不会移动 这看起来很简单 只需将 position fixed 添加到样式中 但内容就会出现在标题下方 因为标题 从流中删除 所以我认为的解决方案是在内容中添加 margin top heigh
  • 在Python中取消引用列表内的列表

    当我以 通用 方式定义列表时 gt gt gt a 3 gt gt gt a 然后尝试仅附加到外部列表的第二个元素 gt gt gt a 1 append 0 1 gt gt gt a 0 1 0 1 0 1 如上所示 它附加到外部列表的所
  • 鼠标移开时保持子菜单打开

    我正在开发的导航菜单具有默认的 CSS 行为 对于那些禁用 JavaScript 的极少数人 默认情况下 不显示子菜单 main navigation ul ul display none 将鼠标悬停时 会显示子菜单 main naviga
  • 如何在 UITests 中访问“tableViewCell”中的“detailTextLabel”?

    我想检查是否有tableViewCell detailTextLabel在我的 UITest 中使用给定的字符串 问题是当我搜索时app tables cells children matching staticText 它只会寻找那些标签
  • 函数 nil.id/0 未定义或私有 - Elixir

    我正在尝试使用监护人身份验证来测试用户 ID 是否等于资源 ID 如果没有当前令牌 并且我尝试访问正在检查令牌的网址 则会收到此错误function nil id 0 is undefined or private 我来自红宝石背景 我不知
  • 语法高亮在 Jekyll 的 MD 文件中不起作用?

    使用 kramdown 解析器和 rouge gem 时 语法荧光笔似乎无法在 Jekyll 中工作 引号也不会突出显示和格式化 标记文件 javascript function order words var array words sp
  • 检查变量类型以进行代码分析

    在 Roslyn 代码分析器中检查变量类型的正确方法是什么 我正在注册一个ObjectCreationExpressionSyntax节点和我可以获取类型 但我不确定检查它是否是我关心的类型的正确方法 我找到了一种通过检查显示字符串来做到这
  • 在“onEnter”挂钩中获取状态名称

    我正在构建一个应用程序 我想在用户进入和离开路线时切换服务中的属性 为此 我需要知道该州的名称onEnter and onExit钩子 这对于onExit钩子 因为我可以注入 state服务并读取当前状态的名称 但由于当前状态尚未设置 当o
  • 从 Google Drive 导出 docx 并转换为 base64

    我正在尝试从 Google 云端硬盘导出 DOCX 文件 gapi client drive files export fileId id alt media mimeType mimeType then response gt var f
  • 在 iOS 7 中预加载数据库

    过去 我发布了带有预加载数据库的应用程序 因此用户无需在第一次运行时更新它 我在另一个问题中找到了一些代码 抱歉 不再有链接 我将其添加到我的应用程序代理中persistentStoreCoordinator method NSPersis
  • Hive 查询:匹配字符串数组中的列值以制作标志

    我有一些记录 其中每一行都属于某些类别 数据类型 字符串数组 和一个单独的唯一类别列表 数据类型 字符串 我需要将每一行与唯一的列表相匹配并为其创建标志 Input ID Category 1 Physics Math 2 Math 3 M
  • printf 通过给定的指针和格式字符串。浮动问题

    由于我想跟踪一些变量以便查看它们如何变化 因此我想创建一个函数 该函数根据变量的类型和指向值的指针接收格式字符串 我希望 在格式字符串的帮助下 printf 能够正确确定该值 实际上它是有效的 但有一个例外 浮点值无法正确打印 这是我的代码