此方法采用向量(inputVector,成员变量)并将其拆分为char * []。每当你遇到一个“;”在向量中,打印出存储在args中的最后一组char *。即使矢量大小为14,循环也会在第5个循环中退出。
矢量数据(换行符分隔项目):
/ bin中/回波
killroy
是
在这里,
;
XYZZY
;
不存在程序
;
/斌/真
;
/斌/假
;
void TrivialShell::splitArguments() {
char* args[MAX_ARGS];
int inputVectorIdx = 0;
int currentArgsIdx = 0;
int startingArgsIdx = 0;
while (inputVectorIdx < inputVector.size()) {
if (inputVector[inputVectorIdx] == ";") {
for (int k = startingArgsIdx; k <= currentArgsIdx; k++) {
cout << args[k];
}
startingArgsIdx = currentArgsIdx + 1;
}
else {
args[currentArgsIdx] =
const_cast<char*>(inputVector[inputVectorIdx].c_str());
}
inputVectorIdx++;
currentArgsIdx++;
}
}
答案 0 :(得分:1)
for (int k = startingArgsIdx; k < currentArgsIdx; k++) {
// ^^
cout << args[k];
}
你正试图打印太多。你没有说过,但我确信它不会跳过循环而是退出程序。
答案 1 :(得分:1)
if (inputVector[inputVectorIdx] == ";") {
for (int k = startingArgsIdx; k <= currentArgsIdx; k++) {
cout << args[k];
}
startingArgsIdx = currentArgsIdx + 1;
}
你的索引迭代器currentArgsIdx比数组args
中的实际数据大小大。所以当你已经有一些垃圾时,你正在做cout<<args[3]
。这是因为你在while循环结束时你的索引:
inputVectorIdx++;
currentArgsIdx++;
以不同方式安排或改变条件:
for (int k = startingArgsIdx; k < currentArgsIdx; k++) {
^^^
cout << args[k];
}