gpt4 book ai didi

c++ - 仅具有变量输入的自定义 sprintf(...) 样式函数

转载 作者:行者123 更新时间:2023-11-30 03:45:12 25 4
gpt4 key购买 nike

唱 Borland C++ Builder 2009。

在一个类似于 String 类的自定义类中(至少为了这个 Q)我有一个函数,如下所示:

(为此 Q 做了一些编辑)

MyString &MyString::Sprintf(const wchar_t *Text, ...)
{
wchar_t ResultStr[1000] ;
va_list List ;
va_start (List, Text) ;
int cnt = vswprintf (ResultStr, Text, List ) ;
#ifdef _DEBUG
if (cnt >= (int)sizeof(ResultStr)) {throw (sizeof(ResultStr)) ;}
#endif
va_end (List) ;
my_internally_handled_string.assign(ResultStr) ;
return *this;
}

不过,我想调整此函数(或创建另一个函数),它只将变量作为输入,并使用类的内部管理字符串作为 vswprintf( ) 函数。

像这样:

MyString &MyString::Sprintf(...)
{
const wchar_t *Text = my_internally_handled_string.c_str() ;
// ... Rest see above

但这不起作用。 vswprintf 抛出异常。 (在 my_internally_handled_string 中使用完全正常的文本进行测试)

我想知道它是否完全有可能和/或我需要做什么才能让它按照我设想的方式工作?

最佳答案

variadic 的变量(或va_start())参数(stdarg.h/cstdarg) 是 macros从 C 继承。第二个参数是最后一个非变量参数(在你的例子中 const wchar_t *Text)。这需要作为引用点来计算以下变量参数的起始地址。如果在 ... 之前没有这样的最后一个参数,那么它就没有找到可变参数的引用点。所以你需要一些东西来给它,比如一个虚拟参数。

您可以保留现有的函数签名

    MyString &MyString::Sprintf(const wchar_t *Text, ...)

除了调用 va_start(List, Text) 之外,不使用参数 Text。请记住,您可以将任何您想要的传递给 vswprintf(),例如

    vswprintf(ResultStr, my_internally_handled_string.c_str(), List);

此外,不要用同名局部变量隐藏参数 Text,尤其是在调用 va_start() 之前,因为它需要 parameter 作为起点。

关于 C++ 中的变量参数值得一提的是 don't use a reference variable作为 ... 之前的最后一个参数。

关于c++ - 仅具有变量输入的自定义 sprintf(...) 样式函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34985300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com