C ++程序在条件为假之前退出循环

时间:2013-04-11 23:38:24

标签: c++ loops

此方法采用向量(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++;
    }
}

2 个答案:

答案 0 :(得分:1)

for (int k = startingArgsIdx; k < currentArgsIdx; k++) {
 //                             ^^
                cout << args[k];
}

你正试图打印太多。你没有说过,但我确信它不会跳过循环而是退出程序。

答案 1 :(得分:1)

你有一个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];
            }