将char *拆分为许多\'\\\\ 0\'字符

|| 以下是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
\'\\0\'
,函数将定位终止
\'\\0\'
。 当然,
pos = strchr(environVar, \'\\0\');
的结果是
*pos == \'\\0\'
strlen(pos) == 0
。因此,您始终复制完全为零的字符。没用。 您还可以设置
environVar = pos;
,而不会跳过NUL字符。因此,下一个对
strchr
的调用将返回
environVar
,并且再也没有取得任何进展。 您还忘记了初始化
buffer
,而是将通配指针传递给
strncpy
,这将破坏内存的随机部分。一旦修复了length参数始终为零的事实,此错误可能会抬起头来。     
        您可以更简单地完成此操作,而无需依赖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
构造函数从指向数组中获取字符,直到到达reaches15ѭ。然后,我们移至下一个字符串,该字符串从前一个字符串的末尾开始一个字符。当到达\“ empty \”字符串(终止序列的双null终止符)时,它停止。     
        这行是错误的。
strncpy( buffer, environVar, strlen(pos) );
pos位于第一个空值处,长度为零。您可能需要strlen(environVar)。 这行可能导致无限循环:
environVar = pos;
由于pos位于\\ 0,它将返回相同的指针。尝试pos + 1。     
        
#include <cstring>
#include <string>
#include <vector>

using namespace std;

int main ()
{
    vector<string> res;

    const char *s = \"=::=::\\0system=blah\\0othervar=blah\\0\";
    const char *p = s;

    while (*s != \'\\0\')
    {
        p = strchr (p, \'\\0\');
        res.push_back (s);
        s = ++p;
    }
}
    

要回复问题请先登录注册