Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-读取和解析方法未获取第二行输入_C_Parsing_Matrix_Io_Strtok - Fatal编程技术网

C-读取和解析方法未获取第二行输入

C-读取和解析方法未获取第二行输入,c,parsing,matrix,io,strtok,C,Parsing,Matrix,Io,Strtok,我正在写一个程序,处理我存储在矩阵结构中的方程组。目的是读取格式中的一行 1 2 3, 2 3 4 这是否等于 x+2y=3 2x+3y=4 目前它只存储 x+2y=3 进入我的母体 我有一种蓝图,我通常用它来解析C中的输入,但为了符合这个赋值,我不得不稍微偏离它,我猜内部循环的标记化过程出了问题,这就是破坏原始输入 相关代码: #define delims " \t\r\n" Matrix createMatrix() { Matrix m = malloc(sizeof(Matr

我正在写一个程序,处理我存储在矩阵结构中的方程组。目的是读取格式中的一行

1 2 3, 2 3 4
这是否等于

x+2y=3

2x+3y=4

目前它只存储

x+2y=3

进入我的母体

我有一种蓝图,我通常用它来解析C中的输入,但为了符合这个赋值,我不得不稍微偏离它,我猜内部循环的标记化过程出了问题,这就是破坏原始输入

相关代码:

#define delims " \t\r\n"

Matrix createMatrix()
{
    Matrix m = malloc(sizeof(Matrix));

    char *input, c;
    int len = 0, max = 1;

    char *row, *coeff;

    int rows = 0, cols;
    bool set = false;

    printf("\n: ");

    input = malloc(max);

    // get input from user
    while ((c = getc(stdin)) != '\0' && c != '\n')
    {
        input[len++] = c;

        if (len == max)
        {
            input = realloc(input, 2*max);
            max *= 2;
        }
    }

    // parse input into equation by (,) delimiter
    row = strtok(input, ",");

    do
    {
        cols = 0;

        // parse equation into coefficients by space delimiter
        coeff = strtok(row, delims);
        setCoeff(m, rows, cols++, atoi(coeff) / 1.0);

        while ((coeff = strtok(NULL, delims)) != NULL)
        {
            setCoeff(m, rows, cols++, atoi(coeff) / 1.0);
        }

        coeff = strtok(NULL,delims);

        rows++;

        if (!set)
        {
            setCols(m, cols);
            set = true;
        }
        else
            assert(cols == m->cols);

    }
    while ((row = strtok(NULL, ",")) != NULL);

    row = strtok(NULL, ",");

    setRows(m, rows);

    return m;
}
矩阵h

#include <stdio.h>
#include <stdlib.h>

#ifndef MATRIX_H_INCLUDED
#define MATRIX_H_INCLUDED

typedef struct Matrix
{
    int rows;
    int cols;
    double coeff[26][27];
} *Matrix;

void setRows(Matrix m, int r);
void setCols(Matrix m, int c);

void setCoeff(Matrix m, int row, int col, double val);

#endif // MATRIX_H_INCLUDED
#包括
#包括
#ifndef矩阵_H_包括在内
#定义包含的矩阵
类型定义结构矩阵
{
int行;
int cols;
双系数[26][27];
}*矩阵;
无效集合行(矩阵m,int r);
void setCols(矩阵m,int c);
无效设置系数(矩阵m,整数行,整数列,双值);
#endif//包括矩阵
矩阵c

#include <stdio.h>
#include <stdlib.h>

#include "Matrix.h"

void setRows(Matrix m, int r)
{
    m->rows = r;
}

void setCols(Matrix m, int c)
{
    m->cols = c;
}

void setCoeff(Matrix m, int row, int col, double val)
{
    m->coeff[row][col] = val;
}
#包括
#包括
#包括“矩阵h”
void setRows(矩阵m,int r)
{
m->rows=r;
}
void setCols(矩阵m,int c)
{
m->cols=c;
}
无效设置系数(矩阵m,整数行,整数列,双值)
{
m->coeff[行][col]=val;
}

您正在使用
strtok
两次:一次读取逗号分隔的数据,然后在内部读取值。while条件将使用指定给它的最新指针,即值读取器,因此它无法为您找到更多行


您必须先读取行,然后读取值,或者对这些行使用单独的方法,而不是同时使用
strtok

您使用
strtok
两次:一次读取逗号分隔的数据,然后在内部读取值。while条件将使用指定给它的最新指针,即值读取器,因此它无法为您找到更多行


您必须先读取行,然后读取值,或者对这些行使用单独的方法,而不是对这两个行都使用strtok。

strtok
维护内部状态以跟踪其剩余位置。这就是为什么第一次调用时要传递原始字符串,但在后续调用时使用
NULL
调用它。您正在尝试交错对strtok的独立调用,因此无法正确区分第一次调用和后续调用

相反,您可以尝试使用
strtok\u r
(POSIX指定的
strtok
的可重入版本,不依赖全局状态,从而避免此问题;在Windows上,等效函数为
strtok\u
)或
strep
(如果您的平台支持);两者都不是标准C的一部分


如果需要可移植性,则需要重新构造代码,以便分别执行解析阶段:首先完全解析所有
,“
分隔的标记,跟踪结果,然后作为第二阶段,parse
'
-从前面的每个结果中分离出标记。

strtok
维护内部状态以跟踪其剩余位置。这就是为什么第一次调用时要传递原始字符串,但在后续调用时使用
NULL
调用它。您正在尝试交错对strtok的独立调用,因此无法正确区分第一次调用和后续调用

相反,您可以尝试使用
strtok\u r
(POSIX指定的
strtok
的可重入版本,不依赖全局状态,从而避免此问题;在Windows上,等效函数为
strtok\u
)或
strep
(如果您的平台支持);两者都不是标准C的一部分


如果需要可移植性,则需要重新构造代码,以便分别执行解析阶段:首先完全解析所有
,“
分隔的标记,跟踪结果,然后作为第二阶段,parse
''
-来自前面每个结果的带分隔符的标记。

您的输入代码不为null,在我看来,它会终止字符串。它也不处理EOF。就我所见,您的输入代码不为null并终止字符串。它也不能处理EOF。我想是这样的。我将修改此方法并报告。我认为情况就是这样。我将修改此方法并报告。