2016-09-12 1 views
0

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; 
} 
+0

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. –

Répondre

3

Vous utilisez strtok deux fois: une fois pour lire des données séparées par une virgule, puis à l'intérieur lire les valeurs. Votre condition while utilisera le dernier pointeur qui lui est donné, qui est le lecteur de valeur, donc il ne peut plus trouver de lignes pour vous.

Vous devrez soit lire les lignes en premier, puis les valeurs ou utiliser des méthodes séparées pour celles-ci, pas strtok pour les deux.

+0

Je me suis dit que c'était le cas. Je vais modifier cette méthode et rendre compte. – TheNotoriousWMB

2

strtok maintient l'état interne pour garder la trace de l'endroit où il est parti. C'est pourquoi vous êtes censé passer la chaîne d'origine la première fois que vous l'appelez mais appelez-la avec NULL lors d'invocations ultérieures. Vous essayez d'entrelacer des appels indépendants à strtok, de sorte qu'il ne sera pas en mesure de faire la distinction appropriée entre le premier appel et les appels suivants.

vous au lieu pourrait essayer d'utiliser strtok_r (une version rentrante de strtok spécifié par POSIX qui ne repose pas sur l'état global, ce qui évite ce problème, sous Windows, la fonction équivalente est strtok_s) ou strsep si vos supports de plate-forme leur; Si vous avez besoin de la portabilité, vous devrez plutôt restructurer votre code pour que vous effectuiez vos phases d'analyse séparément: analysez complètement tous les jetons ',' -delimited, gardez une trace des résultats, puis dans la deuxième phase, analyser les jetons délimités ' ' de chacun des résultats précédents.