c++ - std::string 的 strncpy 等价物?

标签 c++ string strncpy

在 C++ 标准库中是否有与 strncpy 完全相同的?我的意思是一个函数,它将一个字符串从一个缓冲区复制到另一个缓冲区,直到它到达终止符 0?例如,当我必须解析来自不安全源(例如 TCP 数据包)的字符串时,我能够在处理数据的同时执行长度检查。

我已经搜索了很多关于这个主题的内容,我也发现了一些有趣的主题,但所有这些人都对 std::string::assign 感到满意,它也能够将字符大小作为参数进行复制.我对这个函数的问题是,它不执行任何检查是否已经命中终止空值 - 它会认真对待给定的大小并复制数据,就像 memcpy 将其复制到字符串的缓冲区中一样.如果在应对时有这样的检查,那么分配和复制的内存比必须完成的要多得多。

这就是我目前解决这个问题的方式,但我希望避免一些开销:

    // Get RVA of export name
    const ExportDirectory_t *pED = (const ExportDirectory_t*)rva2ptr(exportRVA);
    sSRA nameSra = rva2sra(pED->Name);

    // Copy it into my buffer
    char *szExportName = new char[nameSra.numBytesToSectionsEnd];
    strncpy(szExportName, 
            nameSra.pSection->pRawData->constPtr<char>(nameSra.offset),
            nameSra.numBytesToSectionsEnd);
    szExportName[nameSra.numBytesToSectionsEnd - 1] = 0;

    m_exportName = szExportName;
    delete [] szExportName;

这段代码是我的 PE 二进制文件解析器的一部分(确切地说,是解析导出表的例程)。 rva2sra 将相对虚拟地址转换为 PE 部分相对地址。 ExportDirectory_t 结构包含二进制文件导出名称的 RVA,应该是一个以零结尾的字符串。但这并不总是如此——如果有人愿意,它可以省略终止零,这将使我的程序运行到不属于该部分的内存中,最终会崩溃(在最好的情况下……)。

我自己实现这样的功能问题不大,但如果 C++ 标准库中有针对此实现的解决方案,我会更喜欢它。

最佳答案

如果您知道要从中生成 string 的缓冲区中至少有一个 NUL,那么您可以将它传递给构造函数:

const char[] buffer = "hello\0there";

std::string s(buffer);

// s contains "hello"

如果您不确定,那么您只需在字符串中搜索第一个 null,然后告诉 string 的构造函数复制那么多数据:

int len_of_buffer = something;
const char* buffer = somethingelse;

const char* copyupto = std::find(buffer, buffer + len_of_buffer, 0); // find the first NUL

std::string s(buffer, copyupto);

// s now contains all the characters up to the first NUL from buffer, or if there
// was no NUL, it contains the entire contents of buffer

您可以将第二个版本(它始终有效,即使缓冲区中没有 NUL)包装成一个整洁的小函数:

std::string string_ncopy(const char* buffer, std::size_t buffer_size) {
    const char* copyupto = std::find(buffer, buffer + buffer_size, 0);

    return std::string(buffer, copyupto);
}

但要注意一件事:如果您将 const char* 单独交给单参数构造函数,它将一直运行直到找到 NUL。如果您使用 std::string 的单参数构造函数,请务必知道缓冲区中至少有一个 NUL。

不幸的是(或者幸运的是)对于 std::string 没有内置的与 strncpy 完美等价的东西。

关于c++ - std::string 的 strncpy 等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8885251/

相关文章:

c++ - vector < pair <int, int>>如何排序?

c++ - 提前调用对应于ANOTHER模板函数的所有可能的模板函数

c++ - 防止 vector 项被移动

c++ - 代码中 strncpy 到 strcpy 的等效性

c++ - libevent bufferevent 套接字刷新

java - 如何将字符串替换为一组一个字符

c++ - std::string::reserve() 和 std::string::clear() 难题

android - 为什么我的广播接收器无法识别我的字符串 - 发送短信代码

使用 strncpy 将文件逐行复制到 char 数组中

C++ 将 const char* 复制到 char*