v_list(可变数参数)不能正确转换
C++ - Va_List (Variable Number Parameters) not casting properly
我在c++中创建了一个打印函数,它应该是std::cout
的一个更好的替代品,它与C中的printf
函数非常相似。
问题是它接收的参数数量是可变的,但是使用它们的方式是不正确的。
源代码:
void print(string s, ...)
{
int len = s.length();
int pSum = 0;
for (int i = 0; i < len; i++)
{
if (s[i] == '%' && i < len - 1)
{
char c = s[i + 1];
if (c == 'd' || c == 'i' || c == 's') pSum++;
}
}
va_list ap; // Initialization of the VA list
va_start(ap, pSum); // Start iterating through the VA list
int r;
for (int i = 0; i < len; i++)
{
if (s[i] == '%' && i < len - 1) // Check for % in the string
{
char c = s[i + 1];
if (c == 'i')
{
r = va_arg(ap, int);
cout << r;
i++;
}
}
else cout << s[i];
}
va_end(ap); // Stop iterating over the VA list
fflush(stdout); // Flush standard output stream
}
我用函数调用测试了这段代码:
print("The number %i is the only even prime number.", 2);
输出为:
The number -858993460 is the only even prime number.
为什么会发生这种情况?我试过调试,但完全不知道这个问题是从哪里来的
va_start
的第二个参数应该是函数的最后一个命名参数,所以使用:
va_start(ap, s);
生活例子。
相关文章:
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 为什么此指针值不能转换为整数的规则是什么?
- 为什么 ostream 不能转换为 ostream?
- 为什么 nullptr 不能转换为 int?
- 为什么 boost::interprocess::managed_shared_ptr 到 non-const 不能转换
- 为什么C++设置迭代器不能转换为布尔值?
- 不能转换子类..到其私有基类
- CV 合格类型不能转换为 CV 不合格类型
- lambda 函数的返回类型是 lambda []X ()->X,不能转换为 X
- 为什么通过引用捕获变量的 lambda 不能转换为函数指针?
- initializer_list<T>不能转换为 initializer_list<U>,但 T 可转换为 U
- Auto it = vector.begin()结果类型不能转换为const_iterator
- 如果是字符或字符串返回false,但如果输入不能转换为整数则返回true.c++的while循环
- 为什么指针不能转换为引用
- 不能转换FindFileData.将文件名转换为字符串
- 初始化时不能转换匿名枚举
- String::c_str()和String::data()不能转换为const char*
- 不能转换参数14
- 不能转换boost::lambda::placeholder1_type
- initializer语言 - list不能转换为const margin *