1
votes

Comment empêcher la fermeture de la ligne de commande après avoir appuyé sur Entrée

J'ai donc voulu écrire un programme qui imprime une pyramide en "O", dont la hauteur est donnée par l'entrée de l'utilisateur.

#include <stdio.h>

int main()
{

    int n, i, j, k;
    scanf_s("%d", &n);
    {
        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= n - i; j++)
            {
                printf(" ");
            }
            for (k = 1; k <= 2 * i - 1; k = k + 1);
            {
                printf("O");
            }
            printf("\n");
        }
        return 0;
    }
}

Je suis un débutant complet, donc si vous avez des conseils, n'hésitez pas à les offrir. Quoi qu'il en soit, j'ai essayé de l'exécuter sur un compilateur sur Android; semblait fonctionner, imprimé la pyramide.

Je l'ai essayé sur Microsoft Visual Studio. La ligne de commande s'ouvre, mais après avoir mis le numéro et appuyé sur "Entrée", toute la fenêtre se ferme sans rien me donner. Comment éviter cela? Les programmes qui n'ont pas besoin de l'intervention de l'utilisateur semblent fonctionner correctement.


4 commentaires

Ajoutez getchar() juste avant de return 0;


La balise C ++ ne semble pas pertinente ici. Utilisez-vous C ou C ++?


@ girouette comment insérez-vous exactement cela? Le simple fait de taper cela avant le retour 0 ne fonctionnera pas, non?


toutes ces réponses sont très hacky à mon avis. Ouvrez simplement une fenêtre CMD distincte, accédez à l'emplacement de votre exécutable et exécutez le programme via la ligne de commande.


4 Réponses :


3
votes

Pour le problème que vous avez décrit: empêcher la fenêtre de la console de se fermer sur l'application console Visual Studio C / C ++

Pour votre code, il semble y avoir une erreur, et actuellement votre code ne produira pas de pyramide, mais une barre oblique de O Pour résoudre ce problème:

for (k = 1; k <= 2 * i - 1; k = k + 1); supprimer le ; de cette ligne. Pourquoi cela a résolu le problème?

Quand il y a un ; après la boucle, cela signifie que la boucle ne fait rien, puis les trois lignes suivantes sont:

{
    printf("O");
}

Ce qui signifie qu'il n'y a qu'un seul O imprime, au lieu de l'imprimer en boucle.


3 commentaires

Cette erreur n'empêchera cependant pas une sorte de sortie - un 'O' sur chaque ligne. ... toute la fenêtre se ferme sans rien me donner


Le programme imprime n lignes, chacune avec un 'O' avec des espaces de début. Cela ne répond pas à la question, bien que ce soit une faute.


@WeatherVane J'ai manqué la question, réponse corrigée. Merci!



1
votes

Mis à part le point-virgule après la boucle for (k = 1... , vous n'avez pas de bogue dans ce code; si Visual Studio se ferme, le problème vient de ce programme (il pourrait bien se fermer car le programme a terminé son exécution, mais je ne connais pas ce programme).

Puisque vous écrivez que vous êtes un débutant complet et que vous apprécierez des conseils, je vais vous proposer quelques commentaires stylistiques. Mais ce ne sont que des commentaires sur la façon dont je ferais les choses différemment si j'étais vous, je ne dis pas que ce que vous avez est faux.

  • Noms de variables à une seule lettre: ils vous mordront. Il est vraiment facile de mélanger i, j et k car ce sont toutes des sortes d'index sans signification. Lorsque vos programmes deviendront plus complexes, vous serez heureux d'avoir des noms de variables significatifs. De plus, si vous essayez de localiser des instances d'une variable, la recherche de «i» est beaucoup plus difficile que de rechercher des «espaces» ou «spc»
  • Bloc de code sous scanf_s (): Il n'y a aucune raison d'avoir ce code dans un bloc - tout ce qui fait est de déplacer le code interne d'un onglet vers la droite. L'espace d'écran est précieux.
  • Vous trouverez probablement plus utile d'itérer à partir de 0 que de 1, car vous utiliserez beaucoup votre variable d'itérateur comme index de tableau. Prendre l'habitude d'écrire vos boucles comme for (dex = 0 ; dex < max_val ; dex++) vous servira bien. Notez bien que la comparaison est "dex <max_val" et non "dex <= max_val"
  • Le "k = k + 1" me semble mauvais - les gens qui liront votre code devront s'arrêter et essayer de comprendre pourquoi ce n'est pas seulement "k ++" que les gens attendent et ce que vous utilisez dans les deux autres boucles. (Et même pour l'incrémentation de plus d'un, je m'attendrais à quelque chose comme "k + = 2" et non "k = k + 2")

3 commentaires

Merci pour le conseil. J'ai écrit k = k + 1, car je pensais que le raccourcissement n'était peut-être pas autorisé dans l'instance ou dans qc. A propos de scanf, je n'ai pas vraiment compris pourquoi, mais Visual Studio m'a dit de ne pas utiliser "scanf" normal mais d'utiliser à la place scanf_s, sinon le programme ne se lancera pas. Pourriez-vous expliquer pourquoi?


Désolé, je n'ai aucune idée. Si Microsoft prend en charge scanf (), je l'utiliserais simplement pour que le code soit portable (c'est-à-dire qu'il s'exécute n'importe où). Mais mes antécédents sont tous les systèmes et le codage intégré, donc je n'ai jamais eu à utiliser Windows comme environnement de développement. Lorsque j'écris du code à la maison, j'écris sur une machine virtuelle Linux hébergée sur mon ordinateur Windows (en utilisant VirtualBox - un programme gratuit).


@ChinguunErdenebadrakh, veuillez lire ceci . Quant à savoir pourquoi Microsoft vous avertit de l'utilisation des fonctions standard de la bibliothèque C, vous devrez leur demander. MSVC prend en charge scanf mais ils pensent que vous ne devriez pas l'utiliser.



1
votes

Une fois que l'application console revient de la méthode principale, la fenêtre console associée se ferme automatiquement. Pour le système d'exploitation Windows, ajoutez un system("pause"); avant votre return 0; déclaration. Pour une solution indépendante de la plate-forme, vous pouvez simplement afficher une invite à l'utilisateur et attendre une pression sur une touche avant de revenir de main. Tout caractère restant dans la mémoire tampon d'entrée (entrée à partir de scanf dans ce cas) doit être effacé.

int main()

{
   .........
   .........
   //clear input buffer
   int d;
   while ((d = getchar()) != '\n' && d != EOF) { }
   printf("Press ENTER key to Continue\n");  
   getchar(); 
   return 0;
}


0 commentaires

0
votes

Vous devez inclure le fichier d'en-tête conio.h dans votre programme, puis placer simplement getch (); après la dernière déclaration de cout de votre programme.

Je pense que cela aiderait la fenêtre à la fermer a fonctionné pour moi;)


0 commentaires