2


0

Programmation en C. 10 paires par ligne?

Mon programme doit imprimer 10 paires par ligne. Cependant, il imprime parfois 10 paires par ligne et une autre fois non. Je ne peux pas comprendre ce que je fais mal. J’ai lu le chapitre du livre deux fois. Je comprends le fonctionnement du module, mais il semble que je ne puisse pas l’utiliser très bien ici. Qu’est-ce que j’oublie ici?

Voici ce que j’ai écrit:

Je voudrais savoir pourquoi n’imprime pas 10 paires par ligne tout le temps.

#include
#include

int main(void)
{
int ch;
int i=0; /* counter */

printf("Please enter some characters.\n\n");

while((ch=getchar()) != EOF)
{
if((i%10) == 0)
    putchar('\n');   /*printf("\n); */

if (ch == '\n')
    printf( "\n\\n ");
else if (ch == '\t')
    printf("\\t %d ", ch);
else if (ch < ' ')
    printf("^%2c %3d  ", ch+64, ch);
else
    printf("%2c %3d  ",ch, ch);

i = i+1;
}
return 0;
}

5 Answer


2


Je crois que votre problème réside ici:

if (ch == '\n')
    printf( "\n\\n ");

Lorsque vous rencontrez un retour à la ligne dans votre entrée, vous sortirez un retour à la ligne suivi des caractères \ et n.

Mais ce que vous ne faites pas, c’est ajuster "i" pour indiquer que vous avez commencé une nouvelle ligne. Donc, si votre première nouvelle ligne est le cinquième caractère, «i» sera toujours 5 et vous aurez moins de dix caractères sur la ligne suivante.

De plus, je pense que vous voulez toujours sortir les codes ASCII pour la nouvelle ligne et l’onglet, et le formatage nécessite un peu de travail.

L’échantillon ci-dessous est pour votre éducation uniquement. Si vous le plagiez, vous serez probablement découvert assez rapidement, alors lisez-le et comprenez-le. Ne le copiez pas aveuglément.

#include

int main (void) {
    int ch;
    int i = 0;

    printf("Please enter some characters.\n");

    while((ch=getchar()) != EOF) {

Jusqu’à présent, c’est à peu près la même chose que la vôtre, maintenant nous obtenons un peu différent. Plutôt que «i% 10 == 0», nous exécutons simplement les nombres en continu entre 0 et 9 inclus. Cela mettra fin aux problèmes lorsque vous avez plus de deux milliards de caractères dans votre entrée :-)

        // Ten characters printed? Newline and adjust count.

        if(i == 10) {
            putchar('\n');
            i = 0;
        }

Maintenant, le seul vrai changement est le formatage et les actions pour la nouvelle ligne. Il doit finir avec «i» mis à zéro après l’impression, donc une combinaison des «i = -1» spécifiques à la nouvelle ligne et des «i ++» ci-dessous que chaque cas traverse fera cela:

        // Handle each case.

        if (ch == '\n') {
            // Newline? Print and reset to 0 (after i++ below).

            printf( "\\n %3d\n", ch);
            i = -1;
        } else if (ch == '\t')
            // Tab? Just print tab symbol.

            printf("\\t %3d  ", ch);
        else if (ch < ' ')
            // Control character? Print ^X.

            printf("^%c %3d  ", ch+64, ch);
        else
            // Otherwise just print character as is.

            printf("%2c %3d  ", ch, ch);

        // Increment count.

        i++;
    }
    return 0;
}

Un exemple d’exécution:

pax> echo 'This
...> input crosses many lines, some larger than ten,
...> some smaller.' | ./testprog
Please enter some characters.
 T  84   h 104   i 105   s 115  \n  10
 i 105   n 110   p 112   u 117   t 116      32   c  99   r 114   o 111   s 115
 s 115   e 101   s 115      32   m 109   a  97   n 110   y 121      32   l 108
 i 105   n 110   e 101   s 115   ,  44      32   s 115   o 111   m 109   e 101
    32   l 108   a  97   r 114   g 103   e 101   r 114      32   t 116   h 104
 a  97   n 110      32   t 116   e 101   n 110   ,  44  \n  10
 s 115   o 111   m 109   e 101      32   s 115   m 109   a  97   l 108   l 108
 e 101   r 114   .  46  \n  10


2


Le problème est que lorsque vous commencez une nouvelle ligne après avoir trouvé un caractère de nouvelle ligne, vous ne réinitialisez pas «i». Je suggérerais le changement suivant:

if(char == '\n')
{
    printf("\\n  10  ");
    i = -1;
}

Le i = -1; réinitialise le compteur; tenant compte du fait qu’il sera incrémenté au bas de la boucle (i = 0; continuer; fonctionnerait également). Maintenant, les retours à la ligne sont tous gérés par la vérification de «i% 10 == 0», j’ai donc retiré le retour à la ligne du «printf». J’ai également ajouté le code ASCII pour le ` \ n' afin qu’il soit conforme aux spécifications.

Quelques autres changements que j’apporterais:

Si vous changez l’incrément en «i = (i + 1)% 10», vous éliminerez la légère possibilité de débordement de «i».

Lorsque vous imprimez le caractère de tabulation, il n’est pas nécessaire d’utiliser la mise en forme pour imprimer le code ASCII;

printf("\\t   9  ");

fera la même chose, et peut être légèrement plus rapide selon la façon dont votre compilateur l’optimise.

Pour que les choses s’alignent bien lorsqu’elles sont imprimées, j’imprime des caractères non imprimables avec

printf("^%1c %3d  ", ch+64, ch);

C’est purement esthétique.


0


A ne pas oublier: après la boucle:

if((i%10) == 0)
    putchar('\n');   /*printf("\n); */

L’erreur est:

printf( "\n\\n ");

Devrait être:

printf( "\\n ");

Suivi par:

else if (ch < 32) {
    if (1 <= ch && ch <= 26) {
        printf("Ctrl+%c ", 'A' - 1 + ch);
    } else {
        printf("Ctrl+%c ", 'A' - 1 + ch); // Whatever
    }
}

Surtout sous Windows, «\ r» pourrait se produire.


0


S’il y a une nouvelle ligne dans l’entrée elle-même, votre programme sortira une nouvelle ligne. De cette façon, il ne peut pas toujours y avoir 10 caractères dans la sortie


-1


votre programme imprime l’espace blanc pendant qu’il s’exécute ~ vous devez ajouter l’instruction else if pour sauter par-dessus le caractère espace ~ le code devrait être comme ceci ~

else if(ch == ' ')
continue;