2015-09-26 115 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

谢谢!我使用你的建议修复了我的代码,它工作 –