2015-09-26 70 views
0

該代碼是從文本文件讀取指令並打印出圖形模式。一個是我的功能不能正常工作。該函數將從文件中獲取的字符串向量讀入結構體中。迭代字符串向量C++

下面是我的輸出,我的第二,第三和第六個圖是錯誤的。看起來第二和第三個向量沒有放置正確的行和列號;最後一個按字母順序跳過「e」。 我試圖調試很多次,仍然無法找到問題。

typedef struct Pattern{ 
    int rowNum; 
    int colNum; 
    char token; 
    bool isTriangular; 
    bool isOuter; 
}Pattern; 
void CommandProcessing(vector<string>& , Pattern&); 
int main() 
{ 
for (int i = 0; i < command.size(); i++) 
    { 
     Pattern characters; 
     CommandProcessing(command[i], characters); 

    } 

    system("pause"); 
    return 0; 
} 

void CommandProcessing(vector<string>& c1, Pattern& a1) 
    { 
     reverse(c1.begin(), c1.end()); 
     string str=" "; 


     for (int j = 0; j < c1.size(); j++) 
     { 

      bool foundAlpha = find(c1.begin(), c1.end(), "alphabetical") != c1.end(); 
      bool foundAll = find(c1.begin(), c1.end(), "all") != c1.end(); 
      a1.isTriangular = find(c1.begin(), c1.end(), "triangular") != c1.end() ? true : false; 
      a1.isOuter = find(c1.begin(), c1.end(), "outer") != c1.end() ? true : false; 

      if (foundAlpha ==false && foundAll == false){ 
       a1.token = '*'; 
      } 
      //if (c1[0] == "go"){ 
      else if (c1[j] == "rows"){ 
       str = c1[++j]; 
       a1.rowNum = atoi(str.c_str()); 
       j--; 
      } 
      else if (c1[j] == "columns"){ 
       str = c1[++j]; 
       a1.colNum = atoi(str.c_str()); 
       j--; 
      } 
      else if (c1[j] == "alphabetical") 
       a1.token = 0; 

      else if (c1[j] == "all"){ 
       str = c1[--j]; 
       a1.token = *str.c_str(); 
       j++; 
      } 

     } 

    } 

command format

my output

回答

0

調試(或發佈)代碼之前,你應該儘量做到清潔。它包含許多奇怪的/不必要的部分,使得你的代碼更難理解(並導致剛纔描述的錯誤行爲)。

例如,你有一個,如果在開始的時候:

if (foundAlpha ==false && foundAll == false){

如果沒有阿爾法和所有的命令,這將是永遠真實的,你的循環的整個長度,另命令全部置於else if語句中。 他們不會被執行。

因此,在第二個和第三個示例中,除isTriangularisOuter標誌外,不會讀取任何命令。

而是像這樣的混合結構,考慮以下變化:

  • 添加一個默認的構造相應的圖案結構,初始化它的成員。例如,如果初始化token*,則可以刪除該if和甚至兩個bool所需的變量。
  • 以一種方式進行解析,一致 - 最簡單的方法是將三角形和外部的bool移動到與其他結構相同的結構。 (或者,如果你真的想保持這種find查找,之前在for循環移動它們 - 你只需要設置一次即可)
  • 不斷修改循環變量,這是一個錯誤磁鐵!好的,這條規則有一些罕見的例外,但這不是其中之一。

    相反的str = c1[++j];,以後遞減,你可以只寫str = c1[j+1]

  • 此外,你確定你需要的reverse?這使得你的相對+/- 1索引不清楚。例如,原始命令字符串中的c1[j+1j-1

關於最後一個:這可能是您的outer打印代碼中的一個錯誤,您沒有發佈。

+0

謝謝!我使用你的建議修復了我的代碼,它工作 –