问题描述
||
以下是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 k@R_502_6363@ 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;
}
}