J'écris un programme qui traite des systèmes d'équations que je stocke dans une structure Matrix. Le but est de lire une ligne dans le formatC - Méthode de lecture et d'analyse n'obtenant pas la deuxième ligne d'entrée
1 2 3, 2 3 4
et faire que l'équivalent de
x + 2y = 3
2x + 3y = 4
Actuellement, seuls les magasins
x + 2y = 3
dans ma matrice. J'ai une sorte de plan que j'utilise habituellement pour analyser l'entrée en C mais j'ai dû m'en écarter un peu pour me conformer à cette affectation, je suppose que quelque chose ne va pas avec le processus de tokenisation de la boucle interne et que détruit l'entrée d'origine.
Code pertinent:
#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;
}
Matrix.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
matrix.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;
}
Votre code d'entrée ne se termine pas par null la chaîne aussi loin que je peux voir. Il ne gère pas non plus EOF. –