C++ programme semblable a cmd.exe de Windows

Résolu/Fermé
Wazza6 Messages postés 180 Date d'inscription lundi 31 décembre 2007 Statut Membre Dernière intervention 21 juillet 2012 - 23 mars 2009 à 23:29
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 25 mars 2009 à 01:47
Bonjour,
je fais présentement un programme semblable à cmd.exe de Windows pour mon plaisir, mais il ne fonctionne pas tout à fait.
#include <iostream>
#include <windows.h>

int main
{
   char[50] inst=NULL; // L'instruction (ex: help ou shutdown/s dans cmd.exe .
   bool exit=false;  //Booléen qui détermine si la boucle continue ou pas.

   while(!exit) //tant que "exit" est faux.
     {
        cout <<"...";
        cin <<"inst"; //Demande à l'utilisateur une instruction
       if(inst==exit)
        {
           cout << "bye";
           exit=true;
        }
       else if ...
          ... 
          ...
     }
return 0
}



Mon programme me fait tout jusqu'au if , il ne fait que me renvoyer le cout et le cin du début encore et encore, il ne ferme pas , il n'écrit pas, il ne fait que les deux lignes en souligné dans le code.

Si quelqu'un sait ce qui cloche dans ce code s.v.p me le dire
NOTE:Ceci n'est pas le vrai code mais en gros c'est pareil , si je n'ai pas mis le vrai code c'est pour:
1. Pour ne pas que tout le monde puisse le prendre
2. Parcequ'il est en anglais (c'est moins long à écrire ... Quel paresseux je suis :P )

Merci
P.S. Si vous avez besoin du code contactez-moi au gabars@live.ca
A voir également:

16 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 mars 2009 à 23:35
Salut,
Lorsque tu inclues iostream sans le .h (et c'est une bonne habitude ;-)), les fonctions sont inclues dans l'espace de nom std.
Ainsi les fonctions cout, etc. doivent être appelées par :
std::cout<< (de même pour cin).

Ou alors, si tu veux inclure std à ton namespace courant, tu peux utiliser :
using namespace std;
après les #define.
Cdlt
0
Wazza6 Messages postés 180 Date d'inscription lundi 31 décembre 2007 Statut Membre Dernière intervention 21 juillet 2012 40
23 mars 2009 à 23:42
ah oui désolé j'avais oublié le

using namespage std; avant le main dans le code sur cette page , mais il est inclu dans mon vrai projet.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 mars 2009 à 23:52
D'ailleurs, j'avais même pas regardé ton code, il y a d'autres erreurs.
char inst[50]; pas de NULL, et inversion de la variable et des crochets.
int main()
return 0;
0
Wazza6 Messages postés 180 Date d'inscription lundi 31 décembre 2007 Statut Membre Dernière intervention 21 juillet 2012 40
23 mars 2009 à 23:56
OK merci je vais verifier

Edit: Si tu m'as bien dit de prendre le [50] et de le mettre juste apres le char , ce que j'ai fait , ça ne fonctionne pas et sa me donne:

C:\Users\Administrator\Documents\CC++\1st_cpp\test\lab\main.cpp|12|error: expected unqualified-id before '[' token|

C:\Users\Administrator\Documents\CC++\1st_cpp\test\lab\main.cpp|12|warning: statement has no effect|
si je replace le [50] après la variable , pas d'erreur du côté de la compilation , mais toujours le même résultat en fin de compte
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
24 mars 2009 à 00:05
Edit: Si tu m'as bien dit de prendre le [50] et de le mettre juste apres le char , ce que j'ai fait , ça ne fonctionne pas et sa me donne:
J'ai dit exactement le contraire. Dans ta première version tu avais mis :
char[50] inst=NULL; // L'instruction (ex: help ou shutdown/s dans cmd.exe .
Je te disais que le [50] était à la mauvaise place.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Wazza6 Messages postés 180 Date d'inscription lundi 31 décembre 2007 Statut Membre Dernière intervention 21 juillet 2012 40
24 mars 2009 à 00:01
ah et le main sans les paranthèses et le return 0 sans point-virgule c'est une faute d'inattention en écrivant le message , dans le code il est correct
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
24 mars 2009 à 00:07
Sinon j'ai revu une erreur.
cin <<"inst"; //Demande à l'utilisateur une instruction
Tu as mis les chevrons dans le mauvais sens.
Il faut mettre : cin >> ...
0
Wazza6 Messages postés 180 Date d'inscription lundi 31 décembre 2007 Statut Membre Dernière intervention 21 juillet 2012 40
24 mars 2009 à 00:07
ah oups... au moins maintenant on sait que le problème n'est pas là...
0
Wazza6 Messages postés 180 Date d'inscription lundi 31 décembre 2007 Statut Membre Dernière intervention 21 juillet 2012 40
24 mars 2009 à 00:11
J'ai modifié mon else car il était erroné , maintenant mon programme me dit toujours que la commande est incorrecte... je vais aller voir dans ma discussion précédente sur le C...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
24 mars 2009 à 00:15
J'ai modifié mon else car il était erroné , maintenant mon programme me dit toujours que la commande est incorrecte.
Avec la version de ton programme que tu as donnée, il est difficile de t'aider. Non seulement il y a plein de fautes que tu as rajouté, et en plus la version est incomplète.
0
Wazza6 Messages postés 180 Date d'inscription lundi 31 décembre 2007 Statut Membre Dernière intervention 21 juillet 2012 40
24 mars 2009 à 00:18
ok voici le code complet... attention il est facile de se perdre (je suis TRES désorganisé)
#include <iostream>
#include <windows.h>

using namespace std;


char inst[50];
bool pexit=false;

int main()
{
    char inst[50];
    bool pexit=false;

    while(!pexit)
    {

        cout << ".../$USR/$Dir/LAB.EXE:>";
        cin >> inst;

        if(inst=="exit")
        {
            pexit=true;
            break;
        }
        else if(inst=="help")
        {
            cout << "Note:commands are case sensitive! \n help: Gives this \n exit: shut down the program \n info: gives information about the program."<< endl;
            cout << "texit: shutsdown the program after an amount of time \n wexit: Shuts down windowa "<<endl;
            break;
        }
        else if(inst=="info")
        {
            cout << " Written by Gabriel Arsenault in C++." <<endl;
            break;
        }
        else if(inst=="wexit")
        {
            cout << "Windows will shutdown 5 seconds after you receive a confirmation" <<endl;
            system("Shutdown.exe -r -m @IP -t 5 -c \"Command confirmed...\"");
            break;
        }
        else if(inst=="EntertheSandman")
        {
            cout << "Eeeexiiiit liiight... :P" << endl;
            pexit=true;
            cout << "Variable \" exit \" has been changed to true" <<endl;
            Sleep(750);
            cout << "Bye" <<endl;
            break;
        }

        else if(inst=="revealyoursecret")
        {
            cout << " I swear my intentions are evil... \n Made by Gabriel Arsenault for devil 122 in association with joe prank 2333" << endl;
            break;
        }

        else if(inst=="texit")
        {
            char time;
            time=0;
            cin >> time;
            Sleep(time);
            pexit=true;
            break;
        }
        else
        {
            cout << " Instruction incorrect." <<endl;
        }
    }
    return 0;
}



:P

note: Le programme n'est pas terminé , alors les fonctions décrites dans help ne sont pas toutes vraies
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
24 mars 2009 à 00:28
Effectivement lol.
Ton code compile parfaitement. Néanmoins, il y a des erreurs.
Pour faire une comparaison entre deux tableaux de char, il ne faut pas utiliser l'opérateur == mais la fonction strcmp
if(strcmp(inst,"exit")==0) { //si inst correspond à "exit". N'oublie pas d'inclure string.

Sinon en C++, il y a la classe string qui remplace les tableaux de char, et là l'opérateur == fonctionnerait ;-)).
0
Wazza6 Messages postés 180 Date d'inscription lundi 31 décembre 2007 Statut Membre Dernière intervention 21 juillet 2012 40
24 mars 2009 à 00:31
Les string j'ai déjà essayé mais c'était trop inconfortable... je laisse ça aux filles! =)
Petite blague...
Bref j'ai déjà essayé mais la compilation plantait toujours... je vais essayer avec strcmp... on verra bien
0
Wazza6 Messages postés 180 Date d'inscription lundi 31 décembre 2007 Statut Membre Dernière intervention 21 juillet 2012 40
24 mars 2009 à 00:35
Wow!! ça marche! Merci... quelle erreure stupide... je n'aurais pas dû arrêter mon cours en plein milieu :)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
24 mars 2009 à 00:43
la compilation plantait toujours
Qu'est-ce qui plantait à la compilation ? Ton programme compile parfaitement sur ma machine. Juste qu'il ne faut pas le résultat escompté à l'exécution. Mais ceci est normal puisque tu fais : if (instr=="exit") alors instr contient une adresse mémoire, tout comme "exit". Et comme, ils ne contiennent pas la même adresse, la comparaison sera toujours fausse. D'où l'intérêt de la fonction strcmp.
De plus l'avantage du string (eh oui j'en remets une couche) est que cela simplifie le tout. Et en plus c'est mieux géré.
Tu remplaces juste : char inst[50]; par string inst;

Et sinon pourquoi tu as deux variables globales alors que tu caches leur visibilité dans ta fonction main() ?
0
Wazza6 Messages postés 180 Date d'inscription lundi 31 décembre 2007 Statut Membre Dernière intervention 21 juillet 2012 40
25 mars 2009 à 00:54
Avec string la compilation plante... ça me dit qu'il manque une instruction quelque-pat quelque-chose su genre... c'était pas dans CE programme...
"Et sinon pourquoi tu as deux variables globales alors que tu caches leur visibilité dans ta fonction main() ? "
Ça c'est du jargon pour moi je comprends vraiment pas... mais si ça veut dire que j'ai des variables qui sont en dehors du main :
1. C'est plus le cas
2.C'était parce-que je croyais que la fonction while ne pouvait pas accéder aux variables alors je les ai changés de place.

Merci encore.

P.S. est-ce que les string peuvent être comparés avec un simple
if(nomdestring=="Bou!")
{
     cout << "Ah!!" <<endl;
}

?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
25 mars 2009 à 01:47
D'accord pour les variables globales. Il faut éviter de les utiliser ;-)).

Pour les string, oui l'opérateur== a été redéfini. Ainsi tu peux utiliser la notation if(nomString=="couocu") ;..
C'est l'un des avantages de string.
0