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。我想是这样的。我将修改此方法并报告。我认为情况就是这样。我将修改此方法并报告。