【问题标题】:copy first n chars to an std::string将前 n 个字符复制到 std::string
【发布时间】:2016-11-24 16:44:30
【问题描述】:

我有一个指向未知长度缓冲区的 char 指针:

char* buffer;

如果 N!=0,我需要将前 N 个(N 是输入变量)字符复制到 std::string。 我当前的代码是:

int N = <something>;
std::string text;
if (N != 0)
    text.assign(buffer, N);
else
    text.assign(buffer);

我不喜欢的是,当缓冲区的大小小于 N 时,生成的文本大小为 N。

标准库中是否有任何函数可以将缓冲区的前 N ​​个字符复制到文本而不强制文本大小为 N?

即如果缓冲区只有 1 个字符且 N = 100,我想要 text.size() = 1

解决方案是逐个字节的自定义副本吗?

【问题讨论】:

  • 如果您使用 C++,最好使用 std::string 以及相关的方法和运算符
  • 如果您需要知道字符串的长度,我们共享宇宙的基本物理定律要求扫描字符串,直到找到终止的'\0 字节。没有捷径可走。
  • @SamVarshavchik 我不需要知道缓冲区的长度。我只需要复制拳头N个字符。
  • @GovindParmar 我正在使用 C 和 C++,因为代码将 C 软件与 C++ 软件连接起来
  • 但是您已经清楚地解释了您确实需要知道字符串的长度才能正确执行此操作。这几乎可以达成交易。

标签: c++


【解决方案1】:

您可以使用memchr 查找零字节,并将查找限制为N 个字节:

size_t N = ...;
char* pos = memchr(buffer, '\0', N);
text.assign(buffer, pos ? pos - buffer : N);

如果找不到该字节,则输出字符串的长度应为 N。如果找到,则 memstr 返回指向它的指针。减去原始指针将得到所需的长度。

这不会以任何特殊方式处理 N = 0 的情况 - 也就是说,如果 N 为 0,则输出将为空。如果您想要其他行为,请为其设置特殊情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2019-08-14
    • 2023-03-19
    • 2023-03-26
    • 2012-01-06
    • 2021-10-30
    • 2011-06-09
    相关资源
    最近更新 更多