迭代字符串C ++的向量

时间:2015-09-26 07:27:27

标签: c++ vector

代码是从文本文件中读取指令并打印出图形模式。一个是我的功能不正常。该函数用于读取我从文件中获取的字符串向量到结构。

下面是我的输出,我的第二,第三和第六个图表是错误的。似乎第2和第3个向量没有输入正确的行号和列号;最后一个跳过" 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

1 个答案:

答案 0 :(得分:0)

在调试(或发布)代码之前,您应该尝试使其更清晰。它包含许多奇怪/不必要的部分,使您的代码更难理解(并导致您刚才描述的错误行为)。

例如,您在开头有一个if:

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

如果没有alpha和all命令,则对于整个循环长度,这将始终为true,其他命令都放在else if语句中。 他们不会被执行。

因此,在第二个和第三个示例中,除isTriangularisOuter标志外,不会读取任何命令。

请考虑以下更改,而不是像这样的混合结构:

  • 向Pattern结构添加默认构造函数,初始化其成员。例如,如果您将token初始化为*,则可以删除该if,甚至是它所需的两个bool变量。
  • 以一种方式一致地进行解析 - 最简单的方法是将三角形和外部bool移动到与其他结构相同的结构。 (或者如果你真的想保留这个find查找,请在for循环之前移动它们 - 你只需要设置它们一次!)
  • 修改你的循环变量,这是一个错误的磁铁!好的,这个规则有一些罕见的例外,但这不是其中之一。

    而不是str = c1[++j];,稍后递减,你可以写str = c1[j+1]

  • 另外,您确定需要reverse吗?这使得您的相对+/- 1索引不清楚。例如,原始命令字符串中的c1[j+1j-1

关于最后一个:这可能是您outer打印代码中的一个错误,您没有发布该错误。