2010-11-07 31 views
1

J'ai des questions similaires, mais rien de tout cela ne m'a vraiment aidé dans mon problème. Je reçois une chaîne avec un nombre inconnu de nombres à virgule flottante et je dois les couper séparément en tableau.sscanf dans C. Séparation d'un nombre inconnu de doubles sur une ligne dans un tableau

Ce que j'ai est:

h=0; 
    while(fstring[h]!='\n'){ //So first I count how many spaces there are in the string 
      if(fstring[h]==' '){ 
       sc++; 
      } 
      h++; 
    } 
    vars=sc; 
    for(h=0;h<vars;h++){ 
     sscanf(fstring,"%lf",&scanned); 
     matrix[h]=scanned; 
    } 

Alors pourquoi cela ne fonctionne pas? Il émet une erreur à chaque fois.

+0

Attendez, il a soudainement commencé à travailler .. Je désolé pour l'affichage question bizarre, mais les ordinateurs agissent parfois bizarre .. Qu'est-ce que – Randalfien

+0

ASCII 10? Ne devrait-il pas être 0? – Eiko

+0

Le code que vous avez publié continuera de numériser le premier numéro à plusieurs reprises. –

Répondre

0

Vous pouvez faire quelque chose comme ceci:

#include <stdio.h> 

int main() 
{ 
    double fmatrix[100] = { 0 }; 
    double *matrix = fmatrix; 
    double scanned; 
    int bytesread; 
    char string[100]; 
    char *fstring = string; 
    int i; 

    fgets (string, 99, stdin); 
    fstring = string; 

    while (sscanf (fstring, "%lf%n", &scanned, &bytesread) > 0) 
    { 
     fstring += bytesread; 
     *matrix++ = scanned; 
    } 

    matrix = fmatrix; 

    for (i = 0; i < 50; i++) 
    { 
     printf ("%lf\n", *matrix++); 
    } 
} 
+0

Pourquoi avez-vous besoin d'avoir 'char string [100];' et 'char * fstring = string;'? – Arc676

+0

Vous ne pouvez pas faire d'incréments de pointeur sur 'string' car ce n'est pas un pointeur. Vous pouvez changer le contenu de 'string' mais pas où il est alloué. – onemasse

+0

J'ai essayé ceci en utilisant seulement fstring mais cela n'a pas fonctionné. Pourriez-vous expliquer exactement ce qui se passe si vous utilisez simplement le pointeur pour obtenir l'entrée? Merci. – Arc676

3

Je recommande fortement l'utilisation de strtod plutôt que sscanf ici. Quelque chose comme ceci devrait fonctionner:

char *ptr, *endptr = fstring; 
int h = 0; 
do { 
    ptr = endptr; 
    matrix[h++] = strtod(ptr, &endptr); 
} while (endptr != ptr && isspace(*endptr) && *endptr != '\n'); 

L'allocation de mémoire et la récupération de l'entrée mal formée laissée en exercice.

+0

Cela fonctionne parfaitement. Merci! Le seul problème est que je ne comprends pas ce code :) Pourrait expliquer comment cela fonctionne, à un niveau vraiment fondamental? – Randalfien

+0

J'ai l'un de ces problèmes avec ce code: Erreur de segmentation/Erreur de bus/Limite de mémoire dépassée/Limite de pile dépassée. Y a-t-il un problème avec l'allocation de mémoire? Je n'ai besoin que de 20 nombres max, donc la chaîne doit être inférieure à 20 fois 8 (nombre de chiffres) plus 19 espaces, puis-je limiter cela? – Randalfien

+0

Voici une explication de strtod: http://linux.die.net/man/3/strtod Si ce n'est pas la partie qui n'a pas de sens, s'il vous plaît soyez plus précis sur ce que vous ne comprenez pas. En attendant, * je * ne comprends pas comment vous pouvez être incertain de * quelle * erreur vous obtenez - vous avez énuméré quatre choses entièrement différentes - mais oui, vous êtes probablement en train de courir la fin de votre tableau. Pour vous aider, je vous recommande de poster une nouvelle question avec un cas de test complet que les gens peuvent compiler et regarder un crash. – zwol