嵌入空字符的字符串

string with embedded null characters

有什么方法可以使用 istringstream 来读取嵌入了空字符的字符串吗?例如,如果我有一个字符数组“125 320 512 750 333[=15=] xyz”。有什么方法可以在空字符后得到“xyz”吗?

#include <iostream>
#include <sstream>

using namespace std;

int main() {
    std::string stringvalues = "125 320 512 750 333[=10=] xyz";

    cout << "val: " << stringvalues << endl;

    std::istringstream iss (stringvalues);

    for (int n=0; n<10; n++)
    {
        string val;
        iss >> val;
        std::cout << val << '\n';
    }
    
    return 0;
}

这是从 cplusplus.com 修改而来的示例。想获取null字符后面的部分,很好奇在不知道char数组具体长度的情况下能不能获取到。提前致谢。

只需使用适当大小的 char 数组正确初始化字符串即可。剩下的就自然而然了。

#include <sstream>
#include <string>
#include <cstring>
#include <iostream>
#include <iomanip>
int main() {
    const char array[] = "125 320 512 750 333[=10=] xyz";

    // to get the string after the null, just add strlen
    const char *after_the_null_character = array + strlen(array) + 1;
    std::cout << "after_the_null_character:" << after_the_null_character << std::endl;

    // initialized with array and proper, actual size of the array
    std::string str{array, sizeof(array) - 1};
    std::istringstream ss{str};
    std::string word;
    while (ss >> word) {
        std::cout << "size:" << word.size() << ": " << word.c_str() << " hex:";
        for (auto&& i : word) {
            std::cout << std::hex << std::setw(2) << std::setfill('0') << (unsigned)i;
        }
        std::cout << "\n";
    }
}

会输出:

after_the_null_character: xyz
size:3: 125 hex:313235
size:3: 320 hex:333230
size:3: 512 hex:353132
size:3: 750 hex:373530
size:4: 333 hex:33333300
size:3: xyz hex:78797a

注意读取后的零字节333

Is there any way that I can use istringstream to read strings with embedded null characters?

是的。您可以使用任何 UnformattedInputFunctions,例如 read 成员函数来读取包括空字符的输入。

但是请注意,您的 stringvalues 在空字符之后不包含任何内容,因此从它构造的字符串流也不包含任何内容。如果你想要一个 std::string 包含空字符(终止字符除外),那么你可以使用例如接受大小作为第二个参数的构造函数。

I want to get the part after the null character, and I am curious whether I can get it without knowing the exact length of the char array.

这是一个简单的方法:

const char* string = "125 320 512 750 333[=10=] xyz";
std::size_t length = std::strlen(string);
const char* xyz = string + length + 1;