7
votes

Obtenez Scanf pour quitter quand il lit une nouvelle ligne?

Si j'entraîne 5 5 code> sur le terminal, appuyez sur Entrée, puis appuyez à nouveau sur Entrée, puis je veux quitter la boucle.

int readCoefficents(double complex *c){
    int i = 0;
    double real;
    double img;
    while(scanf("%f %f", &real, &img) == 2)
        c[i++] = real + img * I;


    c[i++] = 1 + 0*I; // most significant coefficient is assumed to be 1
    return i;
}


1 commentaires

Si vous aviez besoin de plus de raisons pour éviter d'utiliser scanf : C-FAQ. com / stdio / scanfprobs.html


5 Réponses :


10
votes

Utilisez Fgets pour lire la console Entrée:

   int res = 2;
   while (res == 2) {
       char buf[100];
       fgets(buf, sizeof(buf), stdin);
       res = sscanf(buf, "%f %f", &real, &img);
       if (res == 2)
           c[i++] = real + img * I;
   }
   c[i++] = 1 + 0*I; // most significant coefficient is assumed to be 1
   return i;


3 commentaires

Vous donner le crédit depuis que vous avez mentionné Fgets et SSCANF en premier.


Merci, juste réalisé C probablement ne vous laissera probablement pas déclarer le tampon à l'intérieur de la boucle tandis que le concept est là.


Cette déclaration est parfaitement bien.



10
votes

Le problème spécifique que vous rencontrez est qu'un scanf code> chaîne de format de % f code> saute l'espace blanc ( y compris em> neufs) jusqu'à ce qu'il soit trouve un personnage réel à numériser. De la norme C99:

Une spécification de conversion est exécutée dans les étapes suivantes:
- Entrez des caractères d'espace blanc (comme spécifié par la fonction Isspace code>) sont ignorés, sauf si la spécification inclut un '[' code>, 'C' code> , ou 'n' code> spécificateur. P> blockquote>

et, ailleurs, décrivant Isspace () code>: p>

Les caractères d'espace blanc standard sont les suivants: espace '' ' code>, flux de formulaire ' \ f ' code>, nouvelle ligne ' \ n ' Code>, chariot retour '\ r' code>, onglet horizontal '\ t' code> et onglet vertical '\ v' code>. p>. blockQquote>

Votre meilleur pari est d'utiliser fgets code> pour obtenir la ligne (et cela peut être protégé du débordement tampon très facilement), puis utilisez sscanf code> sur le Ligne résultante. p>

La fonction code> scanaf code> est l'une de celles que vous devriez examiner très séparément. Le morceau de code suivant est celui que j'utilise souvent pour gérer l'entrée de ligne: p> xxx pré>

p> xxx pré>

le tester avec diverses combinaisons : P>

pax> ./testprog

Enter real and imaginary for #  1: hello
** Invalid input [hello]

Enter real and imaginary for #  1: hello there
** Invalid input [hello there]

Enter real and imaginary for #  1: 1
** Invalid input [1]

Enter real and imaginary for #  1: 1.23 4.56
Values were 1.230000 and 4.560000

Enter real and imaginary for #  2:

pax> _


1 commentaires

+1 Utilisation de Scanf Pour lire l'entrée de l'utilisateur introduit souvent des problèmes tels que celui-ci. Il est généralement beaucoup moins sujet aux erreurs de lire simplement l'entrée en tant que chaîne, puis d'analyser la chaîne.



3
votes

Il y a un moyen de faire ce que vous voulez en utilisant simplement scanf: xxx

si l'utilisateur n'entre que 1 flotteur sur une ligne, il lira la ligne suivante pour la deuxième valeur. Si des déchets aléatoires sont entrés, il sautera à une nouvelle ligne et réessayera à nouveau avec la ligne suivante. Sinon, cela va simplement continuer à lire des paires de valeurs de flottabeur jusqu'à ce que l'utilisateur entre dans une ligne vide ou un EOF soit atteint.


0 commentaires

0
votes

re Paxdiablo Solution: Il ne fonctionne pas correctement avec la ligne vide entrée par l'utilisateur, cette ligne doit donc être ajoutée dans votre fonction getline () xxx

après la ligne: xxx

de sorte qu'il deviendra: xxx


0 commentaires

0
votes

au lieu de

while(scanf("%f %f%*c", &real, &img) == 2)


scanf("%f%*c", &myfloat); // will read a float and all eventual characters after it


0 commentaires