【发布时间】:2016-07-22 11:57:21
【问题描述】:
我想做一些关于 va_list 的练习。这是我的代码。
int myscanf( char* fmt, ... ) {
va_list ap;
va_start ( ap, fmt );
vfscanf ( stdin, fmt, ap );
va_end ( ap );
}
int main() {
int a, b;
myscanf( "%d %d", &a, &b );
}
如上所示,我已经编写了一个 scanf() 并且可以正常工作。
现在我想重定向 myscanf() 中的参数值。
例如,我可以将 fmt 重定向到 myscanf() 中分配的空间
int myscanf( char* fmt, ... ) {
char newFmt[10] = "%d %d";
va_list ap;
va_start ( ap, fmt );
vfscanf ( stdin, newFmt, ap );
va_end ( ap );
}
但是,当我尝试更改其他参数的值时,我会感到困惑。
我可以通过 va_arg() 获取这些变量参数,但我无法修改它们,因为 va_arg() 是一个宏。
int myscanf( char* fmt, ... ) {
va_list ap;
va_start ( ap, fmt );
int* arg1 = (int)va_arg(ap, int*); // get the value of &a in main()
int newA; // I want to read a value by scanf() and store it to &newA
// ??? = &newA // <- how to do?
vfscanf ( stdin, fmt, ap );
va_end ( ap );
}
有什么建议吗?
-----------编辑-----------
感谢回复,
但是有些事情应该澄清一下。
本例中的“值”是“地址”。因此,我的目的是更改目标地址,以便 vfscanf() 将值读取和写入另一个地址空间。
例如,
int gA, gB, gC, gD;
int myscanf( char* fmt, ... ) {
va_list ap;
va_start ( ap, fmt );
// do something for making the following vfscanf() to write value into gC and gD directly
vfscanf ( stdin, fmt, ap );
// don't assign *gA to *gC and *gB to *gD after performing vfscanf()
va_end ( ap );
}
int main() {
myscanf( "%d %d", &gA, &gB );
}
当我将 fmt 更改为 newFmt 时,我们想直接更改 va_list 中的值(在本例中为地址)。
解析问题解决了,因为我可以在从格式字符串解析“%...”时动态分配空间。如果上述问题得到解决,这些空格地址将重复替换输入。
【问题讨论】:
-
va_arg(ap, int); // get the value of &a in main()- 这本身就是不正确的,因为参数的类型是int*,而不是int。 -
在 c++ 中,使用可变参数模板而不是省略号。
-
我将删除 C++ 标签,因为带有省略号的可变参数与现代 C++ 没有密切关系。如果你真的想用 C++ 做到这一点,我会接受 @Jarod42 的建议。
-
@hwliu 那么,您不想在 gA 和 gB 中分配任何内容吗?通话结束后,他们会保留以前的任何价值观吗?
-
@Enzo Ferber 是的,vfscanf() 不应访问 gA 和 gB。我很抱歉我的表达不好。
标签: c variable-length