c++ - 在多个 '\0' 个字符处拆分一个 char*

标签 c++ winapi cstring

以下为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/

相关文章:

c++ - 当子任务具有很强的相互依赖性时,如何构建一个大例程

python - 从 Python 脚本查询 Windows 10/8 监视器缩放?

c++ - 对 RTSP 服务器进行编程以将 RTP 发送给第三方

c++ - 有没有办法使全局函数/静态成员函数可调用一次?

c++ - 如何用我自己的实现替换 MS VC++ 项目中的 WinAPI 函数调用(名称和参数集相同)?

c++ - 如何使用 Code::Blocks 链接到库?

谁能帮我找到这个 C 函数中的错误吗?

C 堆栈分配的字符串作用域

c - 从 C 中的函数返回 C 字符串

c++ - Kinect SDK 2.0 处理和获取深度帧