C++中如何对全局变量进行操作
how to operate on global variables in c++
我需要有关 C++ 中全局变量的帮助。我将一个空的 argv 数组传递给一个解析函数,我试图填充它,但是当我在 main 中访问 argv 时,无论我输入什么,argv[0] 都会返回空的。请帮忙。
static int argc;
static char* argv[100];
void parse(string str, int argc, char* argv[])
{
argc = 0;
char * cstr = new char [str.length()+1];
strcpy (cstr, str.c_str());
char * p = strtok (cstr," ");
int i = 0;
while (p!=0)
{
argc++;
argv[i] = p;
p = strtok(NULL," ");
i++;
}
delete[] cstr;
}
int main( void )
{
string theLine;
while (true)
{
cout << "myshell> ";
getline(cin,theLine);
cout << "Command was: " << theLine << endl;
if ((theLine == "exit") || (cin.eof()) || (theLine == "quit"))
exit(0);
parse(theLine, argc, argv);
cout << "argv[0] " << argv[0] << "\n";
}
}
我试图在解析器函数内将字符串分配给 argv,但是当我在 MAIN 中访问它时,它是空白的。我如何实现我想要做的事情?它与全局变量有关,但我不知道如何。
问题是您在 argv
中将指针存储到 cstr
,但随后您在 parse()
函数的末尾删除了 cstr
。摆脱:
delete[] cstr;
此外,您应该通过引用传递 argc
。否则,当您在 parse()
函数中更新它时,它不会更新调用者的变量。所以应该是:
void parse(string str, int &argc, char *argv[])
但是,你也有内存泄漏。每次调用 parse
时,您都会创建一个新的 cstr
,但绝不会删除它。您应该将函数更改为 return cstr
,并让调用者在完成该解析行后将其删除。
char *parse(str str, int &argv, char *argv[]) {
...
return cstr;
}
然后在你的 main()
循环中,执行:
int main( void )
{
string theLine;
while (true)
{
cout << "myshell> ";
getline(cin,theLine);
cout << "Command was: " << theLine << endl;
if ((theLine == "exit") || (cin.eof()) || (theLine == "quit"))
exit(0);
char *cstr = parse(theLine, argc, argv);
cout << "argv[0] " << argv[0] << "\n";
delete[] cstr;
}
}
您对同名的全局变量和局部变量如何交互感到困惑。
首先让我说有两个不同的对象,每个对象都名为 argc
和两个不同的对象,每个对象都名为 argv
.
第一组是全局变量
static int argc;
static char* argv[100];
第二组是你的parse
函数
的参数
void parse(string str, int argc, char* argv[])
{
argc = 0;
...
}
我从 parse
中提取了一行。这样做实际上是将argc
参数中的对象设置为0。全局argc
中的对象是not设置为0。
让我们重命名上面片段中的一些变量,以清楚地看到哪个名称属于哪个 object/place:
static int global_argc;
static char* global_argv[100];
void parse(string str, int argc, char* argv[])
{
argc = 0;
...
}
现在,请注意我是如何将前两个更改为 global_
,但其余的(所有的,甚至未显示的)仍然是 argc
和 argv
。
您需要从了解变量作用域开始。一旦涉及到数组和指针,比如argv
,事情就变得更加复杂了。我不可能在一个答案中向您解释所有这些,除了:首先了解有关变量和变量范围的更多信息。然后学习指针和数组。然后回到这个程序,看看你能不能修复它,这不是你现在能做的。
这可能需要更多的时间和更多的工作,但不要气馁。
我需要有关 C++ 中全局变量的帮助。我将一个空的 argv 数组传递给一个解析函数,我试图填充它,但是当我在 main 中访问 argv 时,无论我输入什么,argv[0] 都会返回空的。请帮忙。
static int argc;
static char* argv[100];
void parse(string str, int argc, char* argv[])
{
argc = 0;
char * cstr = new char [str.length()+1];
strcpy (cstr, str.c_str());
char * p = strtok (cstr," ");
int i = 0;
while (p!=0)
{
argc++;
argv[i] = p;
p = strtok(NULL," ");
i++;
}
delete[] cstr;
}
int main( void )
{
string theLine;
while (true)
{
cout << "myshell> ";
getline(cin,theLine);
cout << "Command was: " << theLine << endl;
if ((theLine == "exit") || (cin.eof()) || (theLine == "quit"))
exit(0);
parse(theLine, argc, argv);
cout << "argv[0] " << argv[0] << "\n";
}
}
我试图在解析器函数内将字符串分配给 argv,但是当我在 MAIN 中访问它时,它是空白的。我如何实现我想要做的事情?它与全局变量有关,但我不知道如何。
问题是您在 argv
中将指针存储到 cstr
,但随后您在 parse()
函数的末尾删除了 cstr
。摆脱:
delete[] cstr;
此外,您应该通过引用传递 argc
。否则,当您在 parse()
函数中更新它时,它不会更新调用者的变量。所以应该是:
void parse(string str, int &argc, char *argv[])
但是,你也有内存泄漏。每次调用 parse
时,您都会创建一个新的 cstr
,但绝不会删除它。您应该将函数更改为 return cstr
,并让调用者在完成该解析行后将其删除。
char *parse(str str, int &argv, char *argv[]) {
...
return cstr;
}
然后在你的 main()
循环中,执行:
int main( void )
{
string theLine;
while (true)
{
cout << "myshell> ";
getline(cin,theLine);
cout << "Command was: " << theLine << endl;
if ((theLine == "exit") || (cin.eof()) || (theLine == "quit"))
exit(0);
char *cstr = parse(theLine, argc, argv);
cout << "argv[0] " << argv[0] << "\n";
delete[] cstr;
}
}
您对同名的全局变量和局部变量如何交互感到困惑。
首先让我说有两个不同的对象,每个对象都名为 argc
和两个不同的对象,每个对象都名为 argv
.
第一组是全局变量
static int argc;
static char* argv[100];
第二组是你的parse
函数
void parse(string str, int argc, char* argv[])
{
argc = 0;
...
}
我从 parse
中提取了一行。这样做实际上是将argc
参数中的对象设置为0。全局argc
中的对象是not设置为0。
让我们重命名上面片段中的一些变量,以清楚地看到哪个名称属于哪个 object/place:
static int global_argc;
static char* global_argv[100];
void parse(string str, int argc, char* argv[])
{
argc = 0;
...
}
现在,请注意我是如何将前两个更改为 global_
,但其余的(所有的,甚至未显示的)仍然是 argc
和 argv
。
您需要从了解变量作用域开始。一旦涉及到数组和指针,比如argv
,事情就变得更加复杂了。我不可能在一个答案中向您解释所有这些,除了:首先了解有关变量和变量范围的更多信息。然后学习指针和数组。然后回到这个程序,看看你能不能修复它,这不是你现在能做的。
这可能需要更多的时间和更多的工作,但不要气馁。