如何在c ++中对全局变量进行操作

时间:2015-11-06 21:26:11

标签: c++ variables global

我需要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中访问它时,它会显示为空白。我如何实现我想要做的事情?它与全局变量有关,但我无法弄清楚如何。

2 个答案:

答案 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_,但其余的(所有,甚至未显示的)都保持argcargv

您需要从了解变量范围开始。一旦涉及数组和指针,例如argv,事情变得更加复杂。我无法在一个答案中向您解释所有这些,除了:首先了解有关变量和变量范围的更多信息。然后了解指针和数组。然后回到这个程序,看看你是否可以修复它,这不是你现在可以做的事情。 这可能需要更多的时间,还有更多的工作,但不要气馁。