gpt4 book ai didi

c++ - char* 的动态数组(或 chars 的二维动态数组)

转载 作者:行者123 更新时间:2023-11-28 04:49:40 26 4
gpt4 key购买 nike

运行这段代码时,我得到了奇怪的输出。没有编译错误。据我所知,问题出在我的 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);
//}

}

最佳答案

你的问题在这里:

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

一个好的经验法则是,当您发现自己需要 const_cast 时,您可能做错了什么。并不是说您从不需要它,但它确实是一件非常特别的事情。

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

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

这很糟糕。你需要想出一些不同的。

关于c++ - char* 的动态数组(或 chars 的二维动态数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48493876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com