getchar() ne fonctionne pas bien?
J'ai écrit ce code en C++, et j'ai utilisé getchar()
à la pause de la console, mais je ne vois aucun effet de l'utilisation de cette fonction, voici le code:
#include<iostream>
#include<stdio.h>//to pause console screen
using namespace std;
//function prototypes
int getSmallest(int*);
int getOccurrence(int, int*);
int main(){
int a[7], counter=0, smallest;
cout<<"Please enter 7 integers"<<endl;
while(counter!=7){
cin>>a[counter];
counter++;
}
smallest=getSmallest(a);
cout<<"The smallest number is "<<smallest<<"; it apears "<<getOccurrence(smallest,a)<<" times"<<endl;
getchar();//to pause console screen
return 0;
}
int getSmallest(int*x){
int count=0, smallest=*x;
//loop till last item in array
while(count!=7){
if(*x<smallest)
smallest=*x;
count++;
x++;
}
return smallest;
}
int getOccurrence(int smallest, int* address){
int count=0,occ=0;
//loop till last item in array
while(count!=7){
if(*address==smallest)
occ++;
count++;
address++;
}
return occ;
}
- En général, il n'est pas bon de mélanger
cin
avec les autres fonctions d'entrée tels quegetchar
. - ¤ Le problème technique est probablement qu'il y a au moins un caractère de saut de ligne à gauche dans la mémoire tampon d'entrée. La solution pratique pour la tâche de garder la fenêtre de la console à la fin, c'est soit (1) exécutez le programme à partir de la ligne de commande, ou (2) de l'exécuter via un utilitaire qui s'arrête, comme le faisant glisser vers un fichier de commandes avec un
pause
de commande, ou à l'aide de Ctrl F5 dans Visual Studio, ou (3) de l'exécuter dans un débogueur (par exemple, F5 dans Visual Studio) et de placer un point d'arrêt sur l'accolade de fermeture demain
. Il n'y a pas besoin d'attendre pour une clé dans le programme lui-même. Cheers & hth., - Ou peut-être qu'il ne fait pas cela pour les répétitions, mais juste pour aider les gens. (Mais je suis d'accord que c'est vraiment le mérite d'être une réponse, si ce n'est pour être plus facilement visible. C'est la réponse définitive à ce genre de question.)
Vous devez vous connecter pour publier un commentaire.
Comme cela a été souligné, le problème est que votre tampon d'entrée avait une chaîne de caractères pour le numéro ET un retour à la ligne. C++ I/O saute principaux espaces lors de la lecture quelque chose, comme un certain nombre, mais il ne prend pas la fuite des espaces de la mémoire tampon. Elle laisse que pour la prochaine lire à traiter. Donc
getchar()
est d'obtenir que le saut de ligne qui est toujours en attente.Ignorer les conseils de gens qui essaient de vous dire à la méthode flush(), ignore () ou désactivez "tout ce qui était dans la mémoire tampon avant l'
getchar()
appel". Ces fonctions n'ont pas de notions de "non bloquant" d'entrée.Dit d'une autre manière: l'habitude C++ flux d'entrée des fonctions de ne pas avoir un concept de "il n'y a rien là"...mais là vous appeler plus tard et il dit "oh, mais maintenant il y a quelque chose!!!" Il y a une "séquence d'entrée" que vous ne pouvez détecter que l'arrêt lorsque vous appuyez sur les expressions du FOLKLORE.
L'exception à cette règle serait readsome()...qui plutôt que l'exploitation sur une "séquence d'entrée" fonctionne sur le "tampon d'entrée". La recherche d'une telle chose, nous pourrions essayer ceci:
Mais au moins sur ma machine, il ne conduit pas l'effet désiré. Ce qui signifie que même si il y a un retour à la ligne assis dans le terminal d'application ou de système d'exploitation de pipeline quelque part, elle n'a pas encore été aussi loin que le flux interne de la mémoire tampon d'objet pour
cin
. Résultat: il y a un non-blocage de la fonction d'entrée basé sur la mémoire tampon, mais dans ce genre de scénario apparemment, il ne va pas aider.La réel réponse est ce que Alf dit dans le commentaire. La plupart des bons dev environnements ou des configurations de disposer d'un moyen de le configurer pour ne pas laisser la console se ferme automatiquement. Si non, hack autour d'elle avec le lancement de votre méthode. Heck, vous pouvez même mettre un point d'arrêt sur la
return 0
dans les principaux!Notes:
Vous devez être conscient que "correct" C++ inclusions de bibliothèques de compatibilité de C sont en fait que
#include <cfoo>
au lieu de#include "foo.h"
. Il ne peut pas faire tout ce que grand une différence dans la pratique...mais au minimum, il détourne votre question quand les gens font des commentaires à ce sujet (comme je le fais en ce moment):Est-ce une mauvaise pratique de l'utilisation d'un en-tête C à la place de son C++ équivalent en C++ (par exemple stdio.h au lieu de cstdio)?
Aussi, vous pourriez avoir démontré cela avec un plus petit échantillon! Vous pourriez avoir montré l'effet simplement avec:
Essayez donc de rogner vos exemples pour vraiment isoler le problème dans l'avenir! (N'hésitez pas à modifier votre question à ce succinct afin de rendre ce thread plus utile pour les personnes à la recherche.)
Il est peut-être le problème de la mémoire tampon. Parce que de mémoire tampon de la getChar accepte une entrée de la mémoire tampon de sorte qu'il sera mieux
flush buffer
avant d'appeler getChar()Essayez ceci:
Voici les deux suppléants:
getch();
vous devrez utiliser#include <conio.h>
c'est pourquoi ils ont mis isspace et ispunct fonctions dans vos propres prototypes de fonction et d'avoir des pointeurs vers des valeurs de b/c cin>> et "while((ch = getchar()) != '\n')" sont fpermissive plus sortir avec elle est à l'aide d'un pointeur et la taille t est le type de retour de la Cstring la fonction "strlen()"
pour la programmation en c exemple ... ici
si vous voulez seulement écrire du code c++, vous devez faire vos propres fonctions à partir de zéro... ou d'essayer de l'utiliser terrible fonctions qui ont *'s dans leur