Question

Je suis en train de faire un RLE (codeur Run-Length) programme juste pour les personnages. J'ai lu la façon dont il fonctionne sur des notes sur net. Et j'ai essayé de fixer mon code! Peu importe, je pense que les mesures de code sont à droite, le travail ne marche pas de code! Il semble que certains « Z » étrange que cela fonctionne. Je ne peux pas trouver ce que, qui ne va pas! Pourriez-vous s'il vous plaît me donner un conseil?

#include <stdio.h>

int main()
{
    int count;
    unsigned char currChar,prevChar=EOF;
    while(currChar=getchar() != EOF)
    {
        if ( ( (currChar='A')&&(currChar='Z') ) || ( (currChar='a')&&(currChar='z') ) )
        {
            printf("%c",currChar);
            if(prevChar==currChar)
            {
                count=0;
                currChar=getchar();
                while(currChar!=EOF)
                {
                    if (currChar==prevChar)
                        count++;
                    else
                    {   
                        if(count<=9)
                            printf("%d%c",count,prevChar);
                        else
                        {   
                            printf("%d%c",reverse(count),prevChar);
                        }                       
                        prevChar=currChar;
                        break;
                    }
                }
            }
            else
                prevChar=currChar;

            if(currChar==EOF)
            {   printf("%d",count);
                break;
            }
        }
        else
        {
            printf("Error Message:Only characters are accepted! Please try again! False input!");
            break;
        }
    }
    return 0;
}

int reverse(int x)
{
    int p,y,r=0;
    x=(x<0)?-x:x;
    while (x>0)
    {
        y=x%10;
        p=x/10;
        r=10*r+y;
        x=p;
    }
    printf("%d",r);
    return 1;
}

par exemple. J'ai donné l'entrée:

  

AAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEEEEEGGGGGGGGGGGGGGGGVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRHD   RRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMS   TTTTTTTTTTHHHHHHHHHHHH

et je suis sortie:

  

Z0AZZ0AZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0GZZ0GZZ0GZZ0GZZ0GZZ0GZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0RZZ0RZZ0RZZ0RZZ0   ZZ0RZZ0RZZ0RZZ0RZZ0RZZ0RZZ0HZZ0HZZ0HZZ0HZZ0HZZ0HZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : (

Était-ce utile?

La solution

Conversion commentaires précédents dans une réponse ...

  • Il y a des problèmes avec des missions dans le 'si' les conditions -. Comme indiqué dans l'autre réponse

  • Vous ne pouvez pas attribuer une valeur à un unsigned char et alors attendez-vous à détecter EOF. Oubliez le nom - rappelez-vous que getc () et getchar () (et fgetc ()) renvoient un entier, non char; ils doivent retourner un entier parce qu'ils ont besoin de retourner tous les possibles valeur de caractère valide, plus EOF!

  • Votre test à if(currChar=='EOF') est bizarre. Vous utilisez une constante à plusieurs caractères, ce qui est au mieux définie la mise en œuvre, et qui ne va pas être égal EOF (sans guillemets) retourné par getchar (). De plus le type de currChar est erroné.

  • reverse () retourne toujours 0; est ce que vous vouliez vraiment?

  • La ligne « while(currChar=getchar() != EOF) » a besoin entre parenthèses supplémentaires pour qu'il fonctionne comme prévu: « while((currChar = getchar()) != EOF) ». À l'heure actuelle, il assigne 0 (NUL, '\ 0') ou 1 (Control-A) à currChar.

  • Le intérieur while ne lit pas de caractères, il est donc va envoyer votre programme dans une frénésie - il a besoin de la notation « while((currChar = getchar()) != EOF) » affectataire aussi. Ensuite, vous devez travailler ce que l'est vraiment résultat attendu, parce que je ne pense pas que cela fait beaucoup de sens - en particulier, le parasite « printf("%c",currChar); » après le test principal est douteux - peut-être une impression de débogage que vous avez laissé derrière par accident.

  • Vous devez également considérer la façon dont le code doit gérer les choses comme les nouvelles lignes - et c'est avant d'arriver à des problèmes d'ambiguïté dans la sortie (comment voulez-vous faire la différence entre les données codées RLE et les données contenant des valeurs numériques. Il y a beaucoup de choses à vous soucier de votre algorithme! Il est surtout pas correct, je suis désolé de signaler.

Voici une partie semi-travail; il refuse explicitement de traiter avec des chiffres (mais c'est tout).

/* RLE - Run Length Encoding */
/* SO 2485285 */

/*
** Input:  stream of data except for digits 0-9
** Output: stream of data with adjacent sets of 3 or more of the same
**         character represented by 3Z (for ZZZ), etc.
*/

#include <stdio.h>
#include <ctype.h>

static void print_rle(int count, int repchar)
{
    if (count > 2)
        printf("%d%c", count, repchar);
    else if (count == 2)
        printf("%c%c", repchar, repchar);
    else if (repchar != EOF)
        printf("%c", repchar);
}

int main()
{
    int count = 1;
    int currChar;
    int prevChar = EOF;

    while ((currChar = getchar()) != EOF)
    {
        if (isdigit(currChar))
            fprintf(stderr, "Bogus character %c read - ignored\n", currChar);
        else if (currChar == prevChar)
            count++;
        else
        {
            print_rle(count, prevChar);
            count = 1;
            prevChar = currChar;
        }
    }
    print_rle(count, prevChar);

    return 0;
}

Et c'est la sortie quand je le lance sur son propre code source (notez que j'utiliser des espaces, non onglets). Les messages de caractère 'Bogus' sont imprimées sur stderr, non stdout.

/* RLE - Run Length Encoding */
Bogus character 2 read - ignored
Bogus character 4 read - ignored
Bogus character 8 read - ignored
Bogus character 5 read - ignored
Bogus character 2 read - ignored
Bogus character 8 read - ignored
Bogus character 5 read - ignored
/* SO  */

/*
Bogus character 0 read - ignored
Bogus character 9 read - ignored
** Input:  stream of data except for digits -
Bogus character 3 read - ignored
** Output: stream of data with adjacent sets of  or more of the same
Bogus character 3 read - ignored
**9 character represented by Z (for 3Z), etc.
*/

#include <stdio.h>
#include <ctype.h>

static void print_rle(int count, int repchar)
{
Bogus character 2 read - ignored
4 if (count > )
8 printf("%d%c", count, repchar);
Bogus character 2 read - ignored
4 else if (count == )
8 printf("%c%c", repchar, repchar);
4 else if (repchar != EOF)
8 printf("%c", repchar);
}

int main()
{
Bogus character 1 read - ignored
4 int count = ;
4 int currChar;
4 int prevChar = EOF;

4 while ((currChar = getchar()) != EOF)
4 {
8 if (isdigit(currChar))
12 fprintf(stderr, "Bogus character %c read - ignored\n", currChar);
8 else if (currChar == prevChar)
12 count++;
8 else
8 {
12 print_rle(count, prevChar);
Bogus character 1 read - ignored
12 count = ;
12 prevChar = currChar;
8 }
4 }
4 print_rle(count, prevChar);

Bogus character 0 read - ignored
4 return ;
}

Autres conseils

Regardez cette ligne:

if ( ( (currChar='A')&&(currChar='Z') ) || ( (currChar='a')&&(currChar='z') ) )

vous assignez « A » à currChar vous assignez « Z » à currChar et ainsi de suite ...

Vous devez changer = à == pour en faire la comparaison au lieu d'affectation.

En outre, qu'est-ce que vous entendez par (currChar='A')&&(currChar='Z')? currChar ne peut pas être « A » et « Z » en même temps, je crois que ce que vous avez voulu mettre ici était un chèque de currChar être inclus dans certain intervalle. Donc, il devrait probablement être:

(currChar>='A')&&(currChar<='Z')

Le même pour la deuxième partie de votre condition.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top