c++程序在condition为假之前退出循环

C++ Program exits loop before condition is false

本文关键字:退出 循环 程序 condition c++      更新时间:2023-10-16

该方法接受一个向量(inputVector,成员变量)并将其分割为char*[]。每当在vector中遇到";"时,打印出args中存储的最后一组char*s。尽管vector的大小为14,但循环在第5次循环时退出。

Vector data(换行符分隔项):
/bin/echo
killroy

,
,
xyzzy
,
nonexistent-program
,
/bin/true
,
/bin/false
;

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++;
    }
}
for (int k = startingArgsIdx; k < currentArgsIdx; k++) {
 //                             ^^
                cout << args[k];
}

你试图打印一个太多。你没有说过,但我肯定它不只是跳过循环,而是退出程序。

你有一个bug。当你进入循环

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];
            }