运行此代码时,我得到了时髦的输出。没有编译错误。据我所知,问题出在我的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);
//}
}
答案 0 :(得分:1)
你的问题在这里:
ary[c] = const_cast<char*>(temp.c_str());
一个好的经验法则是当你发现自己需要const_cast
时,你可能做错了什么。它不像你从不需要它,但它是一个非常特殊的东西。
无论如何,这里会发生什么?好的,你在ary[0]
读到指向temp
缓冲区的指针。现在你得到你的下一个论点。 最佳案例,ary[0]
和ary[1]
现在指向相同的参数,您丢失了第一个参数。最糟糕的情况是,temp
必须重新分配,现在ary[0]
已经是一个悬空指针。
无论如何,在getArgs()
结束时,temp
被摧毁,现在你所有可能甚至不同的指针都悬空了。
那很糟糕。你需要想出一些不同的东西。