嵌入空字符的字符串
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;
有什么方法可以使用 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;