声明一个固定大小的字符串

时间:2016-08-22 14:35:01

标签: c++

在C中我们做

char buffer[100];

有没有办法声明固定尺寸std::string

6 个答案:

答案 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;

如果您担心由于缓冲区大小导致的堆栈溢出(例如,如果1001'000'000的替代),则可以动态分配它。

std::unique_ptr<std::array<char, 100>> buffer = std::make_unique<std::array<char, 100>>();

由于你的接口以char *为操作数,并且这个对象允许你在运行时查询它的大小,这应该就足够了。