-1

运行代码时出现以下错误:

KSU.CIS308.Project5.exe 中 0x00F66754 处的未处理异常:0xC0000005:访问冲突写入位置 0xFDFDFDFD。

我认为这是由于指针有内存,但也不是它指向的内容。我不知道如何分配它。这是代码,它是 Matrix 对象的构造方法:

Matrix::Matrix(int row, int col)
{
    this->rows = row;
    this->cols = col;
    this->arr = new int*[row];
    for (int i = 0; i < row; i++)
    {
        this->arr[i] = new int[col];
    }
}

this->arr = new int*[row];就是扔它的东西。它是一个指向指针的指针,因此我可以像存储二维数组一样存储矩阵。任何帮助深表感谢。我认为它稍后也会被抛出,但如果我能找出一个,其余的也应该很容易修复。

Arr 在头文件中声明如下:

int **arr;

好的,所以在调试时我发现 col 正在传递 0 这可能解释了错误。 我以为我计算了通过它的正确值。这是主文件。我使用 strtok 将所有内容放入 Vector 中。用户输入格式为:“1 2 3 // 3 2 1” 其中“//”是换行符。

int main() {
    vector<int> v1;
    int rowCountA = 1;
    int colCountA = 0;
cout << "Enter First Matrix (put // to denote row breaks): ";
    char buff[200];
    char *token;
    char *tok;
    scanf("%s", buff);
    token = strtok(buff, "//");
    while (token != NULL)
    {
        tok = strtok(token, " ");
        while (tok != NULL)
        {
            v1.push_back(atoi(tok));
            tok = strtok(NULL, " ");
            colCountA++;
        }

        token = strtok(NULL, "//");
        rowCountA++;
    }



    A = new Matrix(rowCountA, colCountA/(rowCountA+1));

    for (int i = rowCountA; i > 0; i--)
    {
        for (int k = colCountA; k < 1; k--)
        {
            A->setElem(i, k, v1.back());
            v1.pop_back();
        }
    }
}
4

1 回答 1

0

正如您所发现的,问题是将 0 作为维度之一传递,否则二维数组的创建是正确的。您永远不应该允许col为 0,最坏的情况(假设输入为空),使其为 1。
无论如何,您没有正确解析输入:

scanf("%s")只返回第一个数字,因为它停在第一个空格处。您的代码应该fgets()改用。

使用 C 字符串函数,您应该将您的替换scanf("%s", buff);为:

fgets(buff, sizeof(buff)/sizeof(char), stdin);

但是,您不能嵌套调用strtok(). 当您拆分字符串//然后调用strtok每个标记时,您将无法再检索下一,因为它忘记了基于//.

这是您使用 C++ i/o 进行的解析的粗略等价物(尽管代码确实有一些其他错误):

string sbuff;
getline(cin, sbuff);
stringstream ss(sbuff); // header file <sstream>
while (ss >> sbuff) {
    if (sbuff == "//") {
        rowCountA++;
    }
    v1.push_back(atoi(sbuff.c_str()));
    colCountA++;
}
于 2014-12-03T23:56:05.130 回答