我需要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中访问它时,它会显示为空白。我如何实现我想要做的事情?它与全局变量有关,但我无法弄清楚如何。
答案 0 :(得分:1)
问题是您在cstr
中将指针存储到argv
,但是您在cstr
结束时删除了parse()
功能。摆脱:
delete[] cstr;
此外,您应该通过引用传递argc
。否则,当您在parse()
函数中更新它时,它不会更新调用者的变量。所以它应该是:
void parse(string str, int &argc, char *argv[])
但是,您也有内存泄漏。您每次调用cstr
时都会创建新的parse
,但永远不会删除它。您应该更改函数以返回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;
}
}
答案 1 :(得分:0)
您对同名的全局变量和局部变量如何交互感到困惑。
首先我要说的是,有两个不同的对象,每个对象名为argc
,两个不同的对象,每个对象名为argv
。
第一组是全局变量
static int argc;
static char* argv[100];
第二组是parse
函数
void parse(string str, int argc, char* argv[])
{
argc = 0;
...
}
我从parse
开了一行。这样做实际上是将argc
参数中的对象设置为0.全局argc
中的对象不由此设置为0.
让我们重命名上面代码段中的一些变量,以清楚地看到哪个名称属于哪个对象/地点:
static int global_argc;
static char* global_argv[100];
void parse(string str, int argc, char* argv[])
{
argc = 0;
...
}
现在,请注意我如何将前两个更改为global_
,但其余的(所有,甚至未显示的)都保持argc
和argv
。
您需要从了解变量范围开始。一旦涉及数组和指针,例如argv
,事情变得更加复杂。我无法在一个答案中向您解释所有这些,除了:首先了解有关变量和变量范围的更多信息。然后了解指针和数组。然后回到这个程序,看看你是否可以修复它,这不是你现在可以做的事情。
这可能需要更多的时间,还有更多的工作,但不要气馁。