在C中我们做
char buffer[100];
有没有办法声明固定尺寸std::string
?
答案 0 :(得分:4)
您可以像这样使用string::reserve方法
//post comment at task
public function postComment(Request $request, $task_id)
{
$secretApiKey = $request->session()->get('secretApiKey');
if(!empty($secretApiKey)){
//post the msg
$comment=array();
$comment['body']=$request->input('body');
$comment['notify']=$request->input('notify');
$comment['isPrivate']=$request->input('isprivate');
$comment['pendingFileAttachments']=$request->input('pendingFileAttachments');
$comment['content-type']=$request->input('content-type');
$this->callTeamworkApi($secretApiKey,"tasks/".$task_id."/comments.json",json_encode($comment));
}else{
return response()->json(['response'=>"Not Logged In"]);
}
}
//authentication method
public function callTeamworkApi($secretApiKey, $apiCallString,$comment)
{
//cURL
$password = "xxx";
$channel = curl_init();
//options
curl_setopt($channel, CURLOPT_URL, "http://projects.abounde.com/".$apiCallString); // projects.json?status=LATE gets all late projects
curl_setopt($channel, CURLOPT_HTTPHEADER,
array(
"Authorization: Basic " . base64_encode($secretApiKey . ":" . $password)
));
curl_setopt($channel, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($channel, CURLOPT_POSTFIELDS, $comment);
$msg = curl_exec($channel);
curl_close($channel);
return response()->json(['res'=>$msg]);
}
但这不是固定大小,因为您可以使用string :: push_back为字符串添加更多字符。
答案 1 :(得分:4)
在c ++ 17中,std::string_view
将提供与std::string
相同(不可变)的接口。
与此同时,您可以包装一个char数组并向您选择添加任何服务,例如:
template<std::size_t N>
struct immutable_string
{
using ref = const char (&)[N+1];
constexpr immutable_string(ref s)
: s(s)
{}
constexpr auto begin() const { return (const char*)s; }
constexpr auto end() const { return begin() + size(); }
constexpr std::size_t size() const { return N; }
constexpr ref c_str() const { return s; }
ref s;
friend std::ostream& operator<<(std::ostream& os, immutable_string s)
{
return os.write(s.c_str(), s.size());
}
};
template<std::size_t NL, std::size_t NR>
std::string operator+(immutable_string<NL> l, immutable_string<NR> r)
{
std::string result;
result.reserve(l.size() + r.size());
result.assign(l.begin(), l.end());
result.insert(result.end(), r.begin(), r.end());
return result;
}
template<std::size_t N>
auto make_immutable_string(const char (&s) [N])
{
return immutable_string<N-1>(s);
}
int main()
{
auto x = make_immutable_string("hello, world");
std::cout << x << std::endl;
auto a = make_immutable_string("foo");
auto b = make_immutable_string("bar");
auto c = a + b;
std::cout << c << std::endl;
}
答案 2 :(得分:3)
我不知道你想做什么,但是std::array<char, 100> buffer;
你应该做得很好。
然后你可以得到这样的字符串:
std::string str(std::begin(buffer),std::end(buffer);
答案 3 :(得分:1)
从Boost 1.66开始:模拟std::basic_string
接口的非分配字符串。
答案 4 :(得分:1)
选中此https://github.com/m3janitha/fixed_size_string。您可以将char buffer[n];
替换为fss::fixed_size_string<n> buffer;
答案 5 :(得分:0)
你可以使用std::array
,这是C ++方法完全按照你在C中所做的那样。
std::array<char, 100> buffer;
如果您担心由于缓冲区大小导致的堆栈溢出(例如,如果100
是1'000'000
的替代),则可以动态分配它。
std::unique_ptr<std::array<char, 100>> buffer = std::make_unique<std::array<char, 100>>();
由于你的接口以char *
为操作数,并且这个对象允许你在运行时查询它的大小,这应该就足够了。