首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std的strncpy等价物::

std的strncpy等价物::
EN

Stack Overflow用户
提问于 2011-12-08 14:54:12
回答 2查看 2K关注 0票数 4

STL提供了std::,但是由于输出迭代器上没有边界检查,所以在大小固定的输出容器中使用它是很困难的。

所以我发明了我自己的,如下所示

代码语言:javascript
复制
template<class InputIterator , class OutputIterator>
void safecopy( InputIterator srcStart , InputIterator srcEnd , 
                    OutputIterator destStart , OutputIterator destEnd )
{
    while ( srcStart != srcEnd && destStart != destEnd )
    {
        *destStart = *srcStart;
        ++srcStart;
        ++destStart;
    }
}

int main()
{
    std::istream_iterator<char> begin(std::cin), end;       
    char buffer[3];

    safecopy( begin, end, buffer, buffer + 3 );     
    return 0;
}

问题:

  1. ,我是在重新发明方向盘吗?有一个stl算法来做我想做的事情吗?
  2. 在我的安全机器中有什么缺陷吗?它适用于所有std::copy工作吗?
EN

回答 2

Stack Overflow用户

发布于 2011-12-08 15:33:52

我会对你的实施做一个小小的调整。给它一个返回值。最后输出迭代器,或表示复制的元素数的整数。

我看到的函数的主要用例是从输入流中读取固定大小的块,并且不知道何时结束。如果它确实结束了,您需要某种方式来了解它,并且您需要知道在它实际结束之前复制了多少个元素。如果您知道复制了多少个元素,并且它没有满足或超过输出范围的大小,那么您就可以知道它结束了。

票数 1
EN

Stack Overflow用户

发布于 2011-12-08 14:57:25

是。你又在改造方向盘了!

例如,您可以将std::copy用作:

代码语言:javascript
复制
std::copy(s.begin(), s.begin() + 3 , buffer);

而不是这个,

代码语言:javascript
复制
safecopy(s.begin(), s.end() , buffer, buffer + 3);

以这种方式使用std::copy并不比您的safecopy安全。

或者更好的是std::copy_n,它随C++11而来:

代码语言:javascript
复制
std::copy_n(s.begin(), 3, buffer);

即使参数不是随机访问迭代器,这也是可行的。

至于在使用std::vector<char>时,可以直接将其构造函数用作:

代码语言:javascript
复制
std::vector<char> v(s.begin(), s.end());

甚至不需要std::copy

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8432864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档