在其多个'\ 0'字符处拆分char*

Mac*_*ack 1 c++ winapi cstring

以下是C++.我有一个字符串,其中包含我需要在每个变量的声明中将其拆分并将其存储在字符串中的环境变量:

char* envVars = "=::=::\0system=blah\0othervar=blah\0"
Run Code Online (Sandbox Code Playgroud)

所以我使用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;       
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 8

您可以更简单地执行此操作,而无需依赖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;
    }
}
Run Code Online (Sandbox Code Playgroud)

std::string这里使用的构造函数从指向数组中获取字符,直到它到达a \0.然后我们移动到下一个字符串,该字符串从前一个字符串结尾开始一个字符.它在到达"空"字符串(结束序列的双重空终止符)时停止.

  • @Mack:我不明白你的评论.当然它涉及迭代每个角色; 你怎么认为你可以确定组件字符串的长度?你觉得`strchr`怎么样?你真的认为这是多么低效?(你是否会有百万字符长的环境字符串?)如果你已经使用`std :: string`和朋友,没有理由使用`<cstring>`函数.为什么你认为`GetEnvironmentStrings()`函数返回的指针不是const限定的问题? (3认同)