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;
}
5 Réponses :
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;
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.
Le problème spécifique que vous rencontrez est qu'un Une spécification de conversion est exécutée dans les étapes suivantes: et, ailleurs, décrivant Les caractères d'espace blanc standard sont les suivants: espace Votre meilleur pari est d'utiliser 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> p> le tester avec diverses combinaisons : P> 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:
- 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>
Isspace () code>: p>
'' ' 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>
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>
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 Utilisation de Scanf code> 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.
Il y a un moyen de faire ce que vous voulez en utilisant simplement scanf: 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. P> p>
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 () après la ligne: p> de sorte qu'il deviendra: p>
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
Si vous aviez besoin de plus de raisons pour éviter d'utiliser
scanf code>: C-FAQ. com / stdio / scanfprobs.html