char *的动态数组(或2d动态字符数组)

时间:2018-01-29 03:15:47

标签: c++ shell pointers

运行此代码时,我得到了时髦的输出。没有编译错误。据我所知,问题出在我的getArgs(stringstream& ss, int size)函数中。字符串没有正确复制到我的char *变量中。我想要一个动态的char *数组来保存我的命令行参数。我在这里做错了什么?

#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

struct arguments
{
    int argc; //number of arguments
    char **argv; //array of arguments
};

void startupMsg()
{
    cout << "******** CS415 SHELL ********" << endl;
}

int countArgs(stringstream& ss)
{
    string temp;
    int count = 0;
    while (ss >> temp)
    {
        count++;
    }
    return count;
}

char** getArgs(stringstream& ss, int size)
{
    ss.clear();
    ss.seekg(0, ios::beg);
    char **ary = new char*[size];
    for (int i = 0; i < size; i++)
        ary[i] = new char;
    int c = 0;
    string temp;
    while (ss >> temp)
    {
        ary[c] = const_cast<char*>(temp.c_str());
        c++;
    }
    return ary;
}

void printArgs(arguments* args)
{
    for (int i = 0; i < args->argc; i++)
    {
        cout << args->argv[i] << " ";
    }
    cout << endl;
}

arguments* parseCommand(string command)
{
    arguments *args = new arguments;
    stringstream ss(command);
    args->argc = countArgs(ss);
    args->argv = getArgs(ss, args->argc);
    return args;
}

int main()
{
    string command;
    startupMsg();
    //while(true)
    //{
    cout << "user@linux:~$ ";
    getline(cin, command);
    arguments *args = parseCommand(command);
    cout << args->argc << endl;
    printArgs(args);
    //}

}

1 个答案:

答案 0 :(得分:1)

你的问题在这里:

    ary[c] = const_cast<char*>(temp.c_str());

一个好的经验法则是当你发现自己需要const_cast时,你可能做错了什么。它不像你从不需要它,但它是一个非常特殊的东西。

无论如何,这里会发生什么?好的,你在ary[0]读到指向temp缓冲区的指针。现在你得到你的下一个论点。 最佳案例ary[0]ary[1]现在指向相同的参数,您丢失了第一个参数。最糟糕的情况是,temp必须重新分配,现在ary[0]已经是一个悬空指针。

无论如何,在getArgs()结束时,temp被摧毁,现在你所有可能甚至不同的指针都悬空了。

那很糟糕。你需要想出一些不同的东西。