c - 标准功能的问题
问题描述
我正在尝试为 c 做类似字典之类的事情。我希望将不同类型的数据存储在字典中。为了获得无限数量的值,我使用了stdarg.h但在确定数据类型时遇到了问题。我有几个问题:
如何确定每个元素的数据类型?
我怎样才能创建一个循环,直到元素结束?
例如来自 K&R 的这段代码
include <stdarg.h>
/* minprintf: минимальный printf с переменным числом аргумент */
void minprintf(char *fmt, ...)
{
va_list ар; /* указывает на очередной безымянный аргумент */
char *p, *sval;
int ival;
double dval;
va_start(ap, fmt); /* устанавливает ар на 1-й безымянный аргумент */
for (p = fmt; *р; р++) {
if (*p != '%') {
putchar(*p);
continue;
}
switch (*++р) {
case 'd':
ival = va_arg(ap, int);
printf ("%d", ival);
break;
case 'f':
dval = va_arg(ap, double);
printf("%f", dval);
break;
case 's':
for (sval = va_arg(ap, char *); *sval; sval++)
putchar(*sval);
break;
default:
putchar(*p);
break;
}
}
va_end(ap); /* очистка, когда все сделано */
}
这里fmt是包含数量元素的字符串。
但是我怎样才能写一个不包含这个字符串的函数呢?
例如:
#include <stdio.h>
#include <stdarg.h>
void test (const char *, ...);
int main ()
{
test("Hello", "world", 15, 16.000);
return 0;
}
非常感谢您抽出宝贵时间。
解决方案
你不能。
C 根本没有为可变参数函数提供任何方法来独立检测传递的参数类型,也没有提供它们的数量。所以你必须设计你的函数,以便它可以从调用者提供的其他信息中解决这个问题。
推荐阅读
- machine-learning - 有偏差的数据集中的 AUC 中没有反映较低的准确性吗?
- python - 为什么 python watchdog 无法监控某些文件夹?
- python - 如何加入通过不同包管理器(conda、pip)安装的 python 模块?
- python - 需要帮助解决绘制折线图的错误
- c++ - 更改模型有时不会在 QML 中重绘对象
- ssl - 安全全球桌面 (SGD) 认证?
- python - 如何以有效的方式根据熊猫中的其他行更新一行
- php - 使用 array_merge() 合并 x 个数组
- linux - 在 ubuntu 18.04 中使用私有实例将 OSSEC 服务器与 OSSEC 代理连接起来有困难
- postgresql - PostgreSQL 获取给定月份的第 x 个工作日