2013-04-11 48 views
2

該方法使用向量(inputVector,成員變量)並將其拆分爲char * []。每當你遇到一個「;」在矢量中,打印出存儲在參數中的最後一組char *。即使向量大小爲14,循環也會在第5個循環中退出。C++程序在條件爲假前退出循環

矢量數據(新行分開的項目):
/bin中/回波
killroy

這裏;
;
xyzzy
;
不存在程序
;
/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++; 
    } 
} 
+0

但它在退出之前正常打印前四? – 2013-04-11 23:45:41

+2

這裏沒有足夠的代碼來確定它是如何工作的 – Patashu

+0

這是一項家庭作業嗎?是否有一個原因,你將這個函數的'std :: string's轉換爲'char *'s? – JBentley

回答

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

你要打印一個太多。你沒有說過,但我確定它不會跳過循環但退出程序。

+0

當然!非常感謝,我知道這是小事。修正了它 – user2145808

+0

@ user2145808 :) upvote會很好。 – 2013-04-12 00:09:22

+0

我可以給你,你可以upvote我:p – 4pie0

1

你有一個錯誤。當你進入你的循環

if (inputVector[inputVectorIdx] == ";") { 
      for (int k = startingArgsIdx; k <= currentArgsIdx; k++) { 
       cout << args[k]; 
      } 
      startingArgsIdx = currentArgsIdx + 1; 
     } 

你有你的指標迭代器陣列args currentArgsIdx比數據的實際大小更大。所以你在做cout<<args[3]那裏已經有一些垃圾了。這是因爲你在while循環結束++索引:

inputVectorIdx++; 
currentArgsIdx++; 

以不同的方式或變化情況安排這是:

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