先日、関数内で可変長引数を展開する方法について(https://teratail.com/questions/282747#)という質問をいたしました。
提示いただいた内容を応用し、以下のようなコードを記述しました。
cpp
1#include <iostream> 2#include <string> 3#include <vector> 4#include <cstdarg> 5#include <map> 6 7std::map<int, std::string> sentence{ 8 {0, "test sentence1 %s %s %s"} 9}; 10 11void out_func(int code, ...) 12{ 13 auto format = sentence[code].c_str(); 14 va_list args; 15 va_start(args, format); 16 int len = _vscprintf(format, args) + 1; //範囲外のメモリにアクセスしているというエラー 17 std::vector<char> buffer(len * sizeof(char)); 18 vsprintf_s(&buffer[0], len, format, args); 19 va_end(args); 20 std::cout << &buffer[0] << std::endl; 21} 22 23int main() { 24 out_func(0, "first", "second", "third"); 25}
上記のコードはコメントを記述している部分でエラーとなります。
使用方法を間違えているのでしょうか。ご教示いただけますと幸いです。
[追記]
maisumakunさんの回答を受けて以下の形に修正しました。
この形だと構文的には正しいでしょうか?
cpp
1 2std::map<int, std::string> sentence{ 3 {0, "test sentence1 %s %s %s"} 4}; 5 6template <class...Args> 7void out_func(const char* format, Args...args) { 8 int len = _scprintf(format, args...) + 1; 9 std::vector<char> buffer(len * sizeof(char)); 10 sprintf_s(&buffer[0], len, format, args...); 11 std::cout << &buffer[0] << std::endl; 12} 13 14template <class...Args> 15void out_func(int code, Args...args) { 16 out_func(sentence[code].c_str(), args...); 17} 18 19int main() { 20 out_func(0, "first", "second", "third"); 21}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/06 07:14
2020/08/06 07:21
2020/08/06 07:24
2020/08/06 07:25
2020/08/06 07:29