2010-01-04 19 views
4

Je suis un total C n00b essayant de m'enseigner C off K & R. Ma question est un peu embarrassant élémentaire. OK, voici: Je ne peux pas obtenir des programmes en utilisant getchar pour donner le type de sortie que je m'attendais. Si vous avez K & R en main, je suis coincé sur l'exercice 1.13. La question est: «Écris un programme pour imprimer un histogramme des longueurs de mots dans sa saisie» et je ne peux même pas m'attaquer à la version horizontale à cause de ce problème.Comment obtenir un programme utilisant getchar pour s'exécuter?

Je suis sur XP en utilisant Dev-C++ (compilateur mingW) et en exécutant des programmes à partir de la ligne de commande. Mon problème est, quand j'essaye d'exécuter mon programme, il m'attend pour entrer des caractères à balayer, mais quand j'ai fini d'entrer et d'appuyer sur Entrée, cela ne fait rien quoi que ce soit. Je m'attends à ce qu'il avance et imprime l'histogramme comme je m'y attendais. En réalité, cela ne semble même pas compter les longueurs de mots, car comme vous pouvez le voir dans le code, lorsque j'essaie d'imprimer ce qui se trouve dans le tableau ctr juste pour voir s'il contient quelque chose, rien ne s'imprime.

Je suis tellement n00b que je n'ai aucune idée si c'est mon code ou la ligne de commande qui est en faute. Mais je soupçonne que c'est quelque chose avec le système, parce que quand je tente de compiler et d'exécuter a model program, la même chose se produit. Tapez entrée, appuyez sur Entrée, rien ne se passe. Si je Ctrl-C, parfois il crache un astérisque ou deux qui ne ressemble à rien de la sortie du modèle. D'autres fois, il ne fait rien (retourne juste à l'invite).

Voici mon code pour l'exercice. J'ai passé toute une journée là-dessus et je remets en question ma capacité à poursuivre la programmation. J'apprécierais vraiment, vraiment si quelqu'un pourrait me sortir de ce trou!

En outre, j'ai une autre question sur le programme modèle que j'ai mentionné ci-dessus, mais je pense que je devrais le poster dans sa propre question. Merci à tous :)

#include <stdio.h> 

//#define 1 IN 
//#define 0 OUT 
int main() { 
    //start w/ state = OUT 
    int c = 0; 
// int state = OUT; 
    int len = 0; 
    int ctr[12]; 
    int i, j; 
    i = j = 0; 

    for (i = 0; i <12; i++) 
     ctr[i] = 0; 
    while ((c = getchar()) != EOF) 
     if (c != ' ' && c != '\t' && c != '\n') { 
//   state = IN; 
      len++; 
      printf("%d", len); 
      } 
     else { 
      ctr[len]++; 
      len = 0; 
      }    
    for (i = 0; i <12; i++) 
     printf("%d\n", ctr[i]); 
    for (i = 0; i <12; i++) { 
     printf("%d\n", i); 
     for (j = 0; j <= ctr[i]; j++) 
      printf("-"); 
     printf("\n"); 
     } 
    return 0; 
} 
+1

Rien à voir avec votre problème, mais envisagez d'abandonner DevC++. C'est buggé et n'est plus développé. Une bonne alternative aux logiciels libres est Code :: Blocks sur http://www.codeblocks.org. Mais comme je l'ai dit, cela n'a RIEN à voir avec votre problème - la commutation des IDE ne le résoudra pas. –

+0

J'ai eu CB pendant un moment. Vous ne le croiriez pas, mais il est arrivé un moment où je ne savais tout simplement pas comment l'utiliser *: | Plus précisément, la fonctionnalité de débogage: après avoir cliqué sur un bouton gravement faux, il a cessé de me montrer la liste des erreurs dans mon code. Après quelques jours à fouiller dans la documentation, j'ai abandonné et je suis retourné au seul IDE que je connaissais: D –

+0

Anita, désolée d'entendre ça. Avez-vous essayé de poser des questions sur votre problème à http://forums.codeblocks.org. Ou vous pourriez même essayer de poster une question ici sur SO. Franchement, tout doit être meilleur que DevC++. –

Répondre

7

Votre boucle while recherche EOF qui signifie end-of-file, et non end-of-line.

Sous Windows, vous devez taper ctrl-z pour simuler la fin du fichier.

+0

Argh! C'est tout! Les livres ne m'ont pas dit ça. Je me demande où je finirais par apprendre ce "fait amusant" si vous n'êtes pas venu. Merci un mil! –

+1

Si vous voulez le même comportement que prévu K & R, vous bénéficieriez de l'exécution de Linux dans virtualbox: D –

+0

Merci pour la suggestion! Je viens de chercher virtuelle. J'ai un léger cas de surcharge d'information ici. Merde cette courbe d'apprentissage. –

1

Il ne ressemble pas à vous stockez en fait c (votre entrée) partout ... ni l'imprimer. Vous imprimez la taille de la chaîne, mais pas les caractères réels. Si vous ctr [i] = c; quelque part (c'est vous ajouter le caractère au tableau), puis imprimer le tableau, vous verrez votre entrée. Oh oui, la réponse à propos de ctrl-z est également importante. Aussi, si vous êtes totalement nouveau à la langue, je vous encourage fortement à mettre des crochets autour de votre contenu. Il faudra un certain temps avant que vous puissiez simplement jeter un coup d'œil sur le code et savoir ce qui tombera dans le champ de la boucle while et ce qui ne le sera pas si vous n'avez pas d'accolades autour de lui.

+0

J'ai bien peur de ne pas comprendre ce que vous voulez dire - peut-être une paraphrase, s'il vous plaît? Merci! Si vous parlez de la partie où je boucle le tableau et imprime son contenu, alors oui, c'est en fait le nombre de caractères dans chaque mot qui m'intéresse, pas les mots eux-mêmes (l'exercice consiste à imprimer un histogramme des longueurs de mots). –

+1

ah ... je vois. Ok, alors la seule chose à emporter de mon post est la chose au sujet des parenthèses. tandis que (1) {stuff va ici}. Dans votre exemple, vous avez un if/else qui suit votre temps sans crochets. La vieille école C ne le permettait pas, mais les compilateurs modernes qui connaissent le C++ ne s'en occupent pas. Je dis juste que vous devriez utiliser les accolades même si elles ne sont pas obligatoires, au moins pendant que vous apprenez à connaître la langue, parce que vous serez coincé avec des bugs comme while (1) {do stuff; faire plus de choses;} vs. alors que (1) fais suffire; faire plus de choses ;. Il semble similaire, mais est très différent. –

+0

Très vrai. En fait, j'ai passé une heure hier à traquer un autre conditionnel qui est devenu fou (il a commencé avec une déclaration en dessous, mais s'est ensuite étendu sans mes parenthèses). Fera cela à partir de maintenant - merci :) –

1

Je n'ai rien vu de vraiment faux avec le code, donc je l'ai chargé sous gcc et ça semble fonctionner, tant que vous vous souvenez que vous devez mettre un EOF (CTRL-D) pour terminer la boucle while. J'ai entré 4 lignes et bien que je ne puisse faire aucune déclaration sur l'exactitude des réponses, chaque fois que j'appuyais, j'obtiens une série de nombres égaux au nombre de caractères que j'ai entrés, suivi d'un espace. C'est exactement ce que votre code dit de faire.

Lorsque j'ai entré le CTRL-D, j'ai obtenu l'information de résumé. Encore une fois, je ne vais pas faire de déclarations sur l'exactitude de la sortie, mais j'ai obtenu deux sections majeures comme décrit dans votre code.

+0

Il imprime un histogramme de toutes sortes (avec des tirets)? Ce serait tellement génial. Je n'ai aucun moyen de tester mon programme maintenant. Aussi, je suppose que vous êtes sur Ubuntu? Parce que la simulation EOF sous Windows est apparemment Ctrl-Z. –

+0

Oui, il a imprimé un histogramme de quelque sorte. Comme je l'ai dit, je n'ai même pas essayé de valider la sortie. Mon environnement est en fait Cygwin sous Windows 7. Installez le kit de développement et vous avez gcc, gdb, etc Vous pouvez même démarrer le serveur X et faire des choses de l'interface graphique. – jfawcett