以下为C++。 我有一个包含环境变量的字符串,我需要在每个变量的声明中将其拆分并将其存储在一个字符串中:
char* envVars = "=::=::\0system=blah\0othervar=blah\0"
所以我使用 cstring 函数在出现空终止符 char '\0' 时拆分字符串,但它只是进入无限循环。为什么?
找到解决方案:查看代码注释:
vector <string> GetEvironmentVariables()
{
vector <string> envVariables;
char* environVar = GetEnvironmentStrings();
char* pos = strchr( environVar, '\0' );
// As far as I know environVar =::=::\0environVar1=...\0environVar2=...\0"
// so the string has many NULL terminators
while ( pos != NULL )
{
char* buffer;
strncpy( buffer, environVar, strlen(pos) ); // on the 1st iteration: buffer SHOULD = "=::=::\0", 2nd buffer SHOULD = "environVar=...\0"
envVariables.push_back( string(buffer) );
environVar = pos; // SOLUTUION: I need to move over the '\0' pos points to so: environVar = ++pos;
pos = strchr( environVar, '\0' );
printf("Var: %s \n", envVariables.back().c_str() );
printf("env: %s \n", environVar);
system("PAUSE");
// prints out this:
// Var: cRek (same junk each iteration)
// env:
// Press any key to continue....
}
FreeEnvironmentStrings( environVar );
return envVariables;
}
最佳答案
您可以更简单地完成此操作,而无需依赖 C 标准库函数:
#include <string>
#include <vector>
int main()
{
const char* environment = "x=x\0y=y\0z=z\0";
std::vector<std::string> environment_strings;
const char* current_string = environment;
while (*current_string)
{
environment_strings.push_back(current_string);
current_string += environment_strings.back().length() + 1;
}
}
此处使用的 std::string
构造函数从指向的数组中获取字符,直到到达 \0
。然后我们移动到下一个字符串,该字符串从前一个字符串末尾后的一个字符开始。它在到达“空”字符串(结束序列的双空终止符)时停止。
关于c++ - 在多个 '\0' 个字符处拆分一个 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6325925/