3 votes

Inversion des caractères jusqu'à EOF

Je suis en train de créer un programme pour inverser des lignes (chaque caractère) en utilisant getchar . Voici ce que j'ai obtenu jusqu'à présent (mon code est un peu désordonné car je suis un débutant).

#include <stdio.h>
#define MAX_CH 256

int main(void)
{
    int ch = 0;        
    int i = 0;
    int string[MAX_CH] = {0};
    while (ch != '\n')   
    {
        ch = getchar();
        string[i] = ch;
        ++i;
    }
    i = i - 2; // put i back to the position of the last character
    int limit = i;

    int n;
    int reverse[MAX_CH] = {0};
    for (n = 0; n <= limit; ++n)
    {
        reverse[n] = string[i];
        --i;
    }
    for (n = 0; n <= limit; ++n)
    {
        printf("%c", reverse[n]);
    }    
    return 0;
}

Ce code ne fonctionne cependant que pour une seule ligne. Je souhaite l'améliorer pour qu'il puisse lire et imprimer le texte inverse immédiatement après et fonctionner sur plusieurs lignes jusqu'à ce qu'il atteigne EOF. Comment puis-je faire cela ? J'ai essayé de mettre une boucle plus grande while (ch != EOF) à l'extérieur while (ch != '\n') mais cela n'a pas fonctionné.

Merci d'avance pour votre aide.

1voto

chqrlie Points 17105

Vous voulez répéter le code aussi longtemps que vous pouvez lire les lignes d'entrée.

Voici quelques questions à aborder

  • les tableaux n'ont pas besoin d'avoir int type, char est un choix plus approprié.
  • produit une nouvelle ligne après la ligne inversée.
  • vous n'avez pas besoin d'un tableau séparé pour stocker la ligne inversée, vous pouvez simplement imprimer les caractères dans l'ordre inverse à partir de l'élément string de la gamme.
  • vous pouvez utiliser putchar au lieu de printf pour plus de simplicité

Voici une version modifiée :

#include <stdio.h>

#define MAX_CH 256

int main(void) {
    int ch, i, length;
    char string[MAX_CH];

    for (;;) {
        for (i = 0; i < MAX_CH; i++) {
            if ((ch = getchar()) == EOF || (ch == '\n'))
                break;
            string[i] = ch;
        }
        length = i;
        if (length == 0) {
            /* no character read => EOF */
            break;
        }
        for (i = 0; i < length; i++) {
            putchar(string[length - i - 1]);
        }
        putchar('\n');
    }
    return 0;
}

0voto

Paul Ogilvie Points 4852

Vous pouvez utiliser une boucle comme :

do {
   i=0;
   while ((ch=getchar())!=EOF && ch!='\n') {
        string[i++] = ch;
    }
    string[i] = '\0';                    // terminate it
    for (int j=0, i--; j<i; j++, i--) {  // reverse line
        char tmp= string[j];
        string[j]= string[i];
        string[i]= tmp;
    }
} while (ch != EOF);

0voto

P__J__ Points 12922

Voici une version un peu plus universelle. Lit à partir du fichier ou de stdin, toute longueur de ligne est supportée (au moins jusqu'à ce que realloc échoue).

char *reverse(char *str)
{
    size_t len = strlen(str);

    for (size_t pos = 0; pos < len / 2; pos++)
    {
        char tmp = str[pos];

        str[pos] = str[len - 1 - pos];
        str[len - 1 - pos] = tmp;
    }
    return str;
}

#define MEMINC  80

int PrintReversedLines(char *filename)
{
    FILE *fi = !strcmp(filename, "stdin") ? stdin : fopen(filename, "rt");
    char *tmpbuff = NULL, *buff = NULL;
    size_t pos = 0;
    int ch = 0;

    if (!fi) return -1;
    while ((ch = fgetc(fi)) != EOF)
    {
        if (!(pos % MEMINC))
        {
            if (!(tmpbuff = realloc(buff, pos + 80)))
            {
                if (buff) free(buff);
                return -1;
            }
            else
            {
                buff = tmpbuff;
            }
        }
        if (ch == '\r') continue;
        if (ch == '\n')
        {
            buff[pos++] = 0;
            printf("%s\n", reverse(buff));
            free(buff);
            buff = NULL;
            pos = 0;
        }
        else
        {
            buff[pos++] = ch;
        }
    }
    return 0;
}

int main()
{
    PrintReversedLines("stdin");
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X